首页 > 解决方案 > VS2015 C 调试问题:断点当前不会被命中。没有可执行代码与此行相关联

问题描述

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


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

在此处输入图像描述

所以我做了一些实验。

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

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

在此处输入图像描述

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

在此处输入图像描述

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

我检查了这个线程

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

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

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

那么有什么问题呢?

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

标签: cvisual-studio-2015

解决方案


这还不是答案现在是答案。我在这里发布我的调查,所以原帖不会太长。)

试试 1

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

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

在此处输入图像描述

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

试试 2

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

场景一:

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

在此处输入图像描述

场景二:

当前不会命中断点。没有为此文档加载任何符号。

在此处输入图像描述

场景 3:

当前不会命中断点。源代码与原始版本不同。

在此处输入图像描述

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

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

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

对于 1. 根据其描述,我相信调试符号一定是在 1 中加载的,这与 2 不同。但不知何故,调试符号信息在中间的某个地方被破坏了,这导致了一些断点功能还可以,其他功能不好。

尝试 3

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

  • 条件编译
  • 编译器优化

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

我设置为/Od禁用优化cl.exe

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

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

看来还是不行。

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

终于,妈妈的祝福拯救了这一天!

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

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

在此处输入图像描述

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

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

在此处输入图像描述


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

变得更加温和/聪明一点会不会很痛苦?


推荐阅读