关于调试gmsh源码过程中产生的gmsh.dll和gmsh.pdb文件无法匹配,进而导致无法载入pdb文件的问题的形成和解决.

发布时间 2023-07-05 17:49:40作者: bkctbkct

省流版

由于ALL_BUILD会将对应于gmsh.exe的调试文件gmsh.pdb附在对应于gmsh.dll的调试文件gmsh.pdb文件,进而导致gmsh.pdb无法和gmsh.dll文件进行版本匹配,进而导致无法载入,进而导致无法调试gmsh源码;

解决办法: 将对应于gmsh.exe的gmsh.pdb改为其他任意命名即可;或者仅仅生成gmsh-shared项目;

  • 前者可以使得生成的pdb文件存在两份,分别对应gmsh.dll和gmsh.exe文件;
  • 后者可以使得仅仅生成对应于gmsh.dll的pdb文件

原因分析和解决

  1. 软件配置
    gmsh-4.11+vs2015+cmake-3.20+OCC770;

  2. 调试gmsh源码的时候出现以下错误;
    image
    且将本地生成的pdb文件路径写入到符号路径依然无法导入.
    image

  3. 所以问题就是:为什么pdb文件和dll文件之间无法匹配上?

    1. 经过google,发现使用symchk可以验证dll和pdb文件是否能够匹配.
    2. 经过测试发现,两者确实无法匹配.
      image
    3. 所以我本来以为是两者版本不匹配导致上述问题的发生,进而使用pdb版本修改文件,使其能够版本匹配;但pdb文件依然无法导入,所以这个方法不靠谱;
    4. 另一个证据是:我所生成的occ-pdb文件和dll文件使用symchk匹配发现依然无法匹配,但是却可以被vs2015导入;(可能这就是vs的魅力)
  4. 观察输出发现:
    image
    使用ALL_BUILD生成了两次pdb文件;

    1. 所以自然的想到,仅仅生成shared项目,然后使用其生成的pdb文件,发现可以使用了;
      image
      image
    2. 进而可以想到:
      ALL_BUILD会将对应于gmsh.exe的调试文件gmsh.pdb附在对应于gmsh.dll的调试文件gmsh.pdb文件
      同时,可以观察到,通过shared生成的pdb文件为168180kb;通过all-build生成的pdb文件为168332kb;
    3. 因此可以猜测是all-build这步操作出现的问题;
      深入all-build.vcxproj发现,其将pdb输出路径重定向到之前生成pdb文件上,进而导致上述问题的产生;
    4. 解决的思路:
      修改生成路径;或者修改vcxproj配置文件;
  5. 总结

    1. 以后遇到pdb无法导入的问题,可以考虑是否是因为dll和pdb版本不匹配,而不匹配的最显著的表现就是:pdbexplore上是否能够正确的显示符号名称;
    2. 调试问题的时候,不能急躁;一步一步的将正确的地方排除,最后定位到可能的BUG所在;
    3. 这个BUG更多的是一种经验上的增长;并没有带来太多的知识上的提升,这是一个非常低级的BUG;
    4. 从方法论的角度来看:很多问题需要的不仅仅是谷歌,而是沉下心来认真的阅读日志文件,并逐步解决问题;