c - 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
所以我猜优化不是我的方式。
那么有什么问题呢?
任何人都可以解释一下吗?谢谢。
解决方案
(这还不是答案。现在是答案。我在这里发布我的调查,所以原帖不会太长。)
试试 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
坚持风格。
变得更加温和/聪明一点会不会很痛苦?
推荐阅读
- tree - 蒙特卡洛树搜索扩展
- javascript - 如何延迟父组件的渲染,直到子组件中的 setState 完成?
- flutter - 如何制作像 Google 一样的 TextFormField?
- html - 覆盖 flex 属性以在 HTML 中手动设置跨度宽度的方法
- java - java.lang.OutOfMemoryError: Java heap space 在java中做加密时如何处理?
- mysql - 当我尝试基于同一列进行两次排序时,为什么 SQL 不会抛出错误?
- azure-data-explorer - 指定 Azure blob 虚拟文件夹而不是文件以引入 Kusto
- c++ - 声明一个变量,该变量具有 c++ 或 c 中的值,在程序终止时不会被销毁
- latex - 如何制作自定义的 LaTeX 符号
- macos - 将 PCL 升级到 .NET Standard 2.0 后在 Mac 上构建错误