VS2015 C调试问题:不会出现断点。没有可执行代码与此行相关联

时间:2018-10-24 12:45:43

标签: c visual-studio-2015

我正在使用 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:内联/ fp:精确/ D“ _MBCS” /错误报告:提示/ 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“   /错误报告:PROMPT / NOLOGO / TLBID:1 /NODEFAULTLIB:libc.lib   /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib   /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:msvcrtd.lib


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

enter image description here

所以我做了一些实验。

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

我注意到对于某些功能,断点对 可能会被击中 。如下所示:

enter image description here

但是随后我遇到了一个函数,该函数无法敲打结束括号 处的断点。如下所示:

enter image description here

所有后续功能都遇到相同的问题。

我检查了此thread

我尝试了干净的重建,没用。

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

我有/Od,所以我猜优化并不妨碍我。

那怎么可能出问题了?

有人能阐明一点吗?谢谢。

1 个答案:

答案 0 :(得分:0)

这不是答案 现在是答案。我在此处发布调查信息,因此原始帖子不会发布太长了。)

尝试1

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

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

enter image description here

但是没有用。 (这是预料之中的,因为VS2015如何才能知道此pdb文件用于静态链接的lib,而lib现在只是可执行文件的一部分。)

尝试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的{​​{1}}设置为disable optimization

我将cl.exe的{​​{1}}设置为禁用whole program optimization

我删除了/GL-以禁用link time code generation,这也是一种全程序优化。

似乎仍然无法正常工作。

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

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

根本原因是行尾样式!

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

enter image description here

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

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

enter image description here


顺便说一句,我真的没想到Microsoft Visual Studio会严格遵守cl.exe风格

多一点良性/智慧是否有害?