概述:一个具有混合C和汇编的VS2015解决方案,在升级到VS2017或VS2019后,在调试时无法显示汇编代码中的符号。
[2019年10月:问题已解决,详见末尾注释]。
详细信息:
我有一个由VS 2015编译器编译的32位C代码,并包含一个由自定义命令行汇编的32位大型汇编代码parlanse0.asm:
parlanse0.asm Property Pages
Item Type: Custom Build Tool
Command Line: ml /D SANITYCHECKS="1" /D EVENTBUFFERENABLE="1" /D TESTING="1" /D PROFILE="0" /Sg /Sl132 /Sx /Zd /Zi /c /Cx /coff /Zd /Fl "%(FullPath)"
Outputs: parlanse0.obj;%(Outputs)
Additional Dependencies: <list of MASM include file>
Link Objects: Yes
Treat Output As Content: No
我不确定这是否相关,但这是连接器选项:
/OUT:"Debug\run.exe" /MANIFEST /PROFILE /NXCOMPAT:NO /PDB:"Debug/erun.pdb" /DYNAMICBASE:NO "odbc32.lib" "odbccp32.lib" "netapi32.lib" "iphlpapi.lib" "psapi.lib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" /LARGEADDRESSAWARE /MACHINE:X86 /SAFESEH:NO /INCREMENTAL:NO /PGD:".\Debug\run.pgd" /SUBSYSTEM:CONSOLE",5.01" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:".\Debug\run.exe.intermediate.manifest" /MAP":.\Debug/run.map" /ORDER:@"RTSCFunctionOrder.txt" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:\Program Files\Microsoft Platform SDK\Lib" /DELAYLOAD:"iphlpapi.dll" /DELAYLOAD:"comdlg32.dll" /TLBID:1
如果这是连接器命令行,它从哪里获取处理的.obj文件的名称?
该解决方案在VS 2015下编译/构建/运行良好。 我正在尝试升级到VS 2017(更新:2019年9月,问题从未解决,因此我只是尝试了使用VS 2019 ... 仍然有同样的问题)。
升级似乎很琐碎:我只需启动VS 2017并将其指向VS 2015解决方案文件。 显然没有任何改变,至少我的源代码控制(对各种MS生成文件,如.sln看不到任何更改)。 神奇的是,几乎一切都可以正常工作:我可以编译/运行/调试应用程序。
但是,在调试器中尝试“转到源代码”并进入汇编代码时,装配源代码不再可见。 在VS 2015中,“转到源代码”从汇编程序中正常工作。 同样,如果在调试期间选择一个汇编语言源行并尝试“转到反汇编”,则会弹出窗口“无法显示反汇编...与此位置关联的没有可执行代码”,显然是错误的。 这也是在VS 2015下工作的行为。
我需要做出什么更改? 是否有文档描述了有何不同?
[添加:汇编源位于与.C源不同的目录中。 这导致为汇编代码生成的.sbr文件与为C代码生成的.sbr文件在不同的目录中。 显然,汇编代码.sbr未被构建过程捕获。 在日志文件中,我可以看到所有C代码的.sbr文件,但没有看到任何关于汇编的信息。 因此这看起来不对。 但是,我的理解是.sbr文件支持VisualStudio标记查找,而不是对象位置到源行映射,因此我认为这是个错觉。 目录下哪里会生成对象位置到源行的映射? 连接器会这样做吗?]
[添加:根据评论中的建议查看另一个答案,我将/DEBUG选项更改为/DEBUG:FULL,但似乎对问题没有影响。]
[我在两个月后的延迟后发现这一点...] 我在我的汇编代码中的反汇编窗口中看到了这一点:
00480107 CC int 3
00480108 CC int 3
RTSAllocate11D_end:
00480109 8D A4 24 00 00 00 00 lea esp,[esp]
00480110 8D A4 24 00 00 00 00 lea esp,[esp]
00480117 8D A4 24 00 00 00 00 lea esp,[esp]
0048011E 8D A4 24 00 00 00 00 lea esp,[esp]
00480125 8D A4 24 00 00 00 00 lea esp,[esp]
0048012C 8D A4 24 00 00 00 00 lea esp,[esp]
00480133 8D A4 24 00 00 00 00 lea esp,[esp]
0048013A 8D 9B 00 00 00 00 lea ebx,[ebx]
allocate_2to1E_bytes:
这些是“我的”符号,所以它们显然可以到达调试器。我要求反汇编窗口显示行号……但却没有反应。所以某种方式这些符号能够通过,但是没有行号信息或者说可能没有源文件位置信息。有什么想法吗?
编辑:2019年10月9日:问题已被解决。与微软的一次长时间交流使他们同意这是调试器中的问题。我验证了VS 2015 Update 1是最后一个正常工作的版本;VS 2015 Update 2及更高版本、VS 2017和VS 2019都存在相同的问题。微软告诉我,他们已经找出了问题并将在2019年12月发布的VS 2019 v16.4公共版本中提供修复。
CV_DebugSLinesHeader_t
- 你是否尝试在 windbg 中进行调试?也没有显示源代码吗?你是否尝试创建一个简单的测试项目 - 比如一个小的演示汇编文件?同时,你能否公开发送你的 pdb 文件?我可以分析它并准确地设置其中包含的信息。 - RbMm