VS2017使用pdb调试时因缺失obj文件受阻问题求助
解决方案:VS2017 (v141+) 调试无对应.obj文件的.pdb问题
我刚梳理清楚这个问题的根因和几种可行的解决办法,咱们一步步来拆解:
一、问题的核心原因
从VS2017 15.3版本(对应v141工具链的14.11及以上分支)开始,Debug模式下链接器默认启用了/DEBUG:FASTLINK选项。这个选项会把大部分调试数据留在.obj文件中,.pdb只存储指向这些.obj的索引指针——这就导致当本地没有.obj文件时,调试器无法从pdb中读取完整的调试信息,直接抛出找不到.obj的错误。
而VC100(VS2010)和VC140(VS2015)默认使用的是/DEBUG:FULL模式,这种模式下.pdb会包含所有调试信息,完全不依赖.obj文件,所以旧工具链能正常调试。
二、可行的解决方案
1. 修改链接器选项为/DEBUG:FULL
这是最直接的根治办法,让pdb重新包含完整的调试信息:
- 打开项目属性面板,进入链接器 -> 调试
- 将「生成调试信息」选项修改为
/DEBUG:FULL - 或者直接编辑.vcxproj文件,在
<Link>节点下添加配置:
(<DebugInformationFormat>OldStyle</DebugInformationFormat>OldStyle对应/DEBUG:FULL,而默认的ProgramDatabase对应/DEBUG:FASTLINK)
修改后重新生成的pdb就彻底脱离了对.obj文件的依赖,即使删除中间目录也能正常调试。
2. 用pdbcopy工具清理现有pdb的.obj引用
如果已经有现成的pdb文件、不想重新编译,可以用微软官方的pdbcopy工具(属于Windows SDK组件)移除pdb中对.obj文件的指向:
- 打开Windows SDK命令提示符
- 执行命令:
其中pdbcopy original.pdb stripped.pdb /s/s参数会清除pdb中的源文件和.obj文件路径信息,生成的stripped.pdb就能脱离.obj文件正常使用。
3. 临时切换到v141_xp工具链
正如你测试的那样,v141_xp工具链默认没有启用/DEBUG:FASTLINK,所以可以正常调试。但这只是临时的 workaround,因为它针对的是XP兼容场景,长期来看还是推荐前两种方案。
三、验证步骤
按照你之前的复现流程重新测试:
- 用修改后的配置编译项目
- 设置断点,删除Debug中间目录
- 禁用运行时构建,启动调试
此时断点应该能正常命中,不会再出现找不到.obj的错误。
内容的提问来源于stack exchange,提问作者Quentin




