【问题标题】:VS2015 C debugging issue: Breakpoint will not currently be hit. No executable code is associated with this lineVS2015 C 调试问题:断点当前不会被命中。没有可执行代码与此行相关联
【发布时间】:2018-10-24 12:45:42
【问题描述】:

我正在使用 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:精确 /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='假'" /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


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

所以我做了一些实验。

在存在上述问题的.c 文件中,我尝试将断点对添加到all开始花括号和结束括号/strong> 该文件中的 C 函数。

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

但后来我遇到了一个函数,其中结束括号无法命中处的断点。如下:

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

我检查了这个thread

我试过干净重建,没用。

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

我有/Od 所以我猜优化不是我的方式。

那有什么问题呢?

有人能解释一下吗?谢谢。

【问题讨论】:

  • PDB 没有嵌入到库(或其他目标文件)中。如果没有有效的 PDB,就不能在源级别放置断点。它允许它在大括号中的事实可能是由于公认的进入/退出代码。
  • @Michael 谢谢。但是对于该库中的 some 函数,断点可以在主体的开始/结束以外的位置工作。至少看起来。
  • @Michael 如何为库生成 PDB 文件?而且由于 lib 是静态链接到可执行文件的,它的 PDB 还能用吗?
  • PDB 仅包含调试所需的符号和其他内容。它与静态/动态链接无关(所有可执行格式都可以有一个仅对调试器有用的 PDB,而不是用于运行)。试试 /Zi 选项。
  • @Michael 根据 MSDN (msdn.microsoft.com/en-us/library/958x11bc.aspx):/Z7:生成一个 .obj 文件包含完整的符号调试信息以供调试器使用。我>

标签: c visual-studio-2015


【解决方案1】:

(这不是一个答案现在是一个答案。我在这里发布我的调查,所以原来的帖子不会太长了。)

试试 1

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

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

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

试试 2

有 3 种类似的场景无法命中断点。

场景一:

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

场景 2:

当前不会命中断点。未加载任何符号 用于此文档。

场景 3:

当前不会命中断点。源代码不一样 从原始版本。

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

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

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

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

试试 3

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

  • 条件编译
  • 编译器优化

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

我将/Odcl.exe 设置为disable optimization

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

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

好像还是不行。

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

最后,我妈妈的祝福拯救了这一天!

根本原因原来是行尾样式!

Visual Studio 不断提示我输入包含无法访问断点的 C 文件。如下:

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

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


顺便说一句,我真的没想到 Microsoft Visual Studio 会如此严格坚持CR LF 风格。

变得更善良/聪明一点会不会很痛苦?

【讨论】:

    猜你喜欢
    • 2013-02-18
    • 2018-10-22
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 2018-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多