发布版*.pdb文件是否绑定到特定编译版本?
PDB文件与编译版本的绑定问题
我已经解决了发布版*.exe生成*.pdb文件以分析用户转储的问题,但疑惑是否必须保存*.pdb文件,还是可以通过源码重新生成。以下是我的测试过程:
- 编译一个会故意崩溃的
*.exe(称为「A.exe V1」)。 - 将「A.exe V1」复制到另一台机器。
- 运行「A.exe V1」,程序崩溃并生成「A.dmp V1」。
- 将「A.dmp V1」复制回本机,可正常调试该转储文件。
- 删除所有
*.pdb文件,尝试调试「A.dmp V1」,系统提示「无法找到或不匹配'A.exe'的调试信息」(符合预期)。 - 未修改任何源代码,重新编译程序(称为「A.exe V2」),生成新的
*.pdb文件¹。 - 尝试调试「A.dmp V1」,系统意外提示「无法找到或不匹配'A.exe'的调试信息」。
- 将「A.exe V2」复制到另一台机器,生成新转储文件「A.dmp V2」,可正常调试该转储文件。
我的疑问是:*.pdb文件是否绑定到特定编译版本?还是我操作有误?
¹新生成的*.pdb文件与之前的文件大小不同!?
解答
*.pdb文件确实绑定到特定的编译版本,你的操作没有问题,出现不匹配是正常现象。
原因如下:
- 即便源代码完全不变,编译器每次编译时也可能生成不同的二进制内容,比如嵌入的时间戳、随机生成的GUID、编译器内部临时变量分配差异等,这些差异会让新生成的
*.pdb带有唯一的调试标识符(Debug ID),而这个ID会和对应的*.exe绑定。 - 调试转储文件时,调试器会严格验证
*.pdb的Debug ID是否与转储中记录的*.exe的Debug ID完全一致,只要不匹配就会提示调试信息无法找到或不匹配。
因此,必须保存每个发布版本对应的*.pdb文件,不能依赖重新编译生成的*.pdb调试旧版本的转储文件。如果尝试重新生成匹配的*.pdb,需要保证编译环境完全一致:包括编译器版本、编译选项、系统环境变量、第三方库版本等所有可能影响编译结果的因素,但即便如此也无法100%保证生成完全一致的文件,最稳妥的方式还是在发布程序时同步归档对应的*.pdb文件。
内容的提问来源于stack exchange,提问作者PaperBirdMaster
相关产品推荐
相关产品推荐

