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

VS2015 C debugging issue: Breakpoint will not currently be hit. No executable code is associated with this line

我正在用 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


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

所以我做了一些实验。

在有上述问题的 .c 文件中,我尝试将断点对添加到 beginning 大括号和 ending 所有 该文件中的 C 函数的括号。

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

但是后来我遇到了一个函数,在结束括号处的断点不能被打。如下所示:

并且所有后续函数都遇到同样的问题。

我检查了这个thread

我试过干净重建,没有用。

我使用 /Z7 所以没有 PDB 文件。 我猜所有调试信息都嵌入在 lib 文件中。

我有 /Od 所以 我想 优化不妨碍我。

那有什么问题吗?

任何人都可以解释一下吗?谢谢。

(这还不是答案现在是答案。我post我调查到这里所以原来的post不会太长。)

尝试 1

我尝试使用 /Zi 作为我的库。它会生成一个 vc140.pdb 文件。 (顺便说一句,lib 文件的大小比 /Z7 的情况小很多)

然后我调试我的应用程序。我尝试将此 vc140.pdb 文件放入符号文件 window 中,如下所示:

但是没有用。 (这是意料之中的,因为 VS2015 怎么知道这个 pdb 文件是用于静态链接库的,它现在只是可执行文件的一部分。)

尝试 2

有3个类似的断点不能打的场景。

场景 1:

The breakpoint will not currently be hit. No executable code of the debugger's target code type is associated with this line.

场景 2:

The breakpoint will not currently be hit. No Symbols have been loaded for this document.

场景 3:

The breakpoint will not currently be hit. The source code is different from the original version.

在调查过程中,我有幸遇到了他们3人。

要修复 2,请查看此处:http://www.wwwlicious.com/2016/02/28/how-to-load-debug-symbols-during-debugging/

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

对于 1。根据它的描述,我相信调试符号一定是在 1 中加载的,这与 2 不同。但是不知何故,调试符号信息在中间某处损坏,这会导致某些功能的断点正常,而其他功能则不好。

尝试 3

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

  • 条件编译
  • 编译器优化

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

我将 cl.exe/Od 设置为 disable optimization

我为 cl.exe 设置了 /GL- 以禁用 whole program optimization

我去掉了/LTCG来禁用link time code generation,这也是一种全程序优化

似乎还是不行。

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

(终于有妈妈的祝福化险为夷了!)

根本原因原来是行尾风格!

Visual Studio 一直提示我输入包含无法到达的断点的 C 文件。如下:

在我规范化行尾之后,所有断点现在都可以正常工作了!

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


顺便说一句,我真的没想到微软Visual Studio坚持CR LF风格所以严格

多一点疼吗benign/intelligent?