VS2015 C调试问题:断点当前无法命中。此行没有关联可执行代码。

3

我正在使用Visual Studio 2015编写C程序。

我的C可执行文件链接一个.lib文件,这个文件是从我的可执行文件中分开构建的。

.lib文件也是用C语言编写的,并以以下方式构建:

cl.exe 标志:

/nologo /c /WX /GS- /W4 /Gs32768 /D UNICODE /Od /GL- /Gy /EHs-c- /GR- /GF /Z7 /Gm- /Gw

link.exe 标志:

/NOLOGO /LTCG


我的可执行文件是这样构建的:

cl.exe 标志:

/GS- /TC /W4 /Zc:wchar_t Z7 /Gm /O1 /Fd"C:\source\TEST2.pdb" /Zc:inline /fp:precise /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /MTd /Fa"x64\Debug\" /Fo"C:\source\x64\Debug\" /Fp"x64\TEST2.pch" /c /WX- /GS- /W4 /Gs32768 /D UNICODE /Od /GL- /Gy /EHs-c- /GR- /GF /Z7 /Gm- /Gw /wd4054 /wd4477 /U_DEBUG

link.exe 标志:

/OUT:"C:\source\x64\Debug\TEST2.exe" /MANIFEST /NXCOMPAT /PDB:"C:\source\x64\Debug\TEST2.pdb" /DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" /DEBUG /MACHINE:X64 /INCREMENTAL:NO /PGD:"C:\source\x64\Debug\TEST2.pgd" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\TEST2.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /TLBID:1 /NODEFAULTLIB:libc.lib /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:msvcrtd.lib


当我调试整个应用程序时,我在某些 库中的断点遇到以下错误。

enter image description here

我做了一些实验。

在出现问题的 .c 文件中,我尝试在所有 C 函数的开头大括号和结尾大括号之间添加断点对。

我注意到对于某些函数,断点对可以被触发。如下所示:

enter image description here

但是,我遇到了一个函数,在该函数的结尾大括号处的断点无法被触发。如下所示:

enter image description here

所有后续函数都遇到了相同的问题。

我查看了这个线程

我尝试了清理重建,但没有用。

我使用了 /Z7,因此没有 PDB 文件。我猜想所有的调试信息都嵌入在 lib 文件中。

我使用了 /Od,因此我猜想优化不会影响我的实验。

那么可能出了什么问题呢?

有人能够提供一些帮助吗?谢谢。


@Michael 如何为一个库生成PDB文件?由于该库静态链接到可执行文件中,它的PDB仍然有用吗? - smwikipedia
PDB仅包含调试所需的符号和其他内容。它与静态/动态链接无关(所有可执行格式都可以具有仅对调试器有用而不是运行的PDB)。尝试使用/Zi选项。 - Michael Chourdakis
1
@Michael 根据 MSDN (https://msdn.microsoft.com/zh-cn/library/958x11bc.aspx) 的说明:*/Z7: 生成一个 包含 完整符号调试信息的 .obj 文件,可供调试器使用。* - smwikipedia
我刚看到它,但说实话我从未使用过。尝试使用 /Zi。 - Michael Chourdakis
@Michael .lib 只是打包了一堆 obj。所以我猜调试信息应该在里面。无论如何,我会尝试一下。 - smwikipedia
显示剩余2条评论
1个回答

1

(这不是一个答案现在这是一个答案了。我把我的调查结果发布在这里,这样原始帖子就不会太长了。)

尝试1

我尝试使用/Zi来制作我的库文件。它生成了一个vc140.pdb文件。(顺便说一下,库文件的大小比/Z7情况要小得多)

然后我调试我的应用程序。我试图将这个vc140.pdb文件放入符号文件窗口中,如下所示:

enter image description here

但是它没有起作用。(这是可以预料的,因为VS2015怎么会知道这个pdb文件是静态链接库的,而现在它只是可执行文件的一部分呢。)
尝试2:
有3种类似的情况无法命中断点。
情况1:

目前不会命中断点。调试器的目标代码类型中没有与此行关联的可执行代码。

enter image description here

场景2:

断点当前无法命中。此文档未加载任何符号。

enter image description here

场景3:

断点当前无法被触发。源代码与原始版本不同。

enter image description here

在调查过程中,我很幸运地遇到了它们三个。

要解决2,请查看这里: http://www.wwwlicious.com/2016/02/28/how-to-load-debug-symbols-during-debugging/

要解决3,请仔细检查您的文件是否是正确的版本。

对于1. 根据其描述,我相信在1中已经加载了调试符号,但与2不同。但不知何故,在中间某个位置调试符号信息损坏,导致一些函数的断点正常,而其他函数则无法正常工作。

尝试3

根据错误描述,可能有两个最有可能的原因:

  • 条件编译
  • 编译器优化

现在我专注于编译器优化。

我将/Od设置为cl.exedisable optimization

我将cl.exe/GL-设置为禁用整个程序优化

我删除了/LTCG以禁用链接时代码生成,这也是一种整个程序优化。

似乎还是不起作用。

尝试4 --- 问题解决!!!

(最终,我的妈妈的祝福拯救了这一天!)

根本原因竟然是行结束样式!

Visual Studio一直提示我包含无法访问的断点的C文件。如下所示:

enter image description here

我把行尾标准化之后,现在所有的断点都正常工作了!

以下是以前无法到达的断点。

enter image description here


顺便说一句,我真的没想到微软的Visual Studio如此严格地坚持使用CR LF格式。

稍微友善/智能一点会有什么损失吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接