You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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兼容场景,长期来看还是推荐前两种方案。

三、验证步骤

按照你之前的复现流程重新测试:

  1. 用修改后的配置编译项目
  2. 设置断点,删除Debug中间目录
  3. 禁用运行时构建,启动调试
    此时断点应该能正常命中,不会再出现找不到.obj的错误。

内容的提问来源于stack exchange,提问作者Quentin

火山引擎 最新活动