我正在使用 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中的 一些 断点 遇到以下错误。
所以我做了一些实验。
在具有上述问题的.c
文件中,我尝试将断点对添加到的开始大括号和 end 括号中该文件中的所有C函数。
我注意到对于某些功能,断点对 可能会被击中 。如下所示:
但是随后我遇到了一个函数,该函数无法敲打结束括号 处的断点。如下所示:
所有后续功能都遇到相同的问题。
我检查了此thread。
我尝试了干净的重建,没用。
我使用/Z7
,所以没有PDB文件。 我猜所有调试信息都嵌入lib文件中。
我有/Od
,所以我猜优化并不妨碍我。
那怎么可能出问题了?
有人能阐明一点吗?谢谢。
答案 0 :(得分:0)
(这不是答案还 。现在是答案。我在此处发布调查信息,因此原始帖子不会发布太长了。)
我尝试将/Zi
用于我的lib。并生成一个vc140.pdb
文件。 (顺便说一下,lib文件的大小比/Z7
的情况要小得多)
然后调试我的应用程序。我试图将此vc140.pdb
文件放在符号文件窗口中,如下所示:
但是没有用。 (这是预料之中的,因为VS2015如何才能知道此pdb文件用于静态链接的lib,而lib现在只是可执行文件的一部分。)
在3种类似的情况下,无法达到断点。
方案1:
该断点当前不会被命中。没有可执行代码 调试器的目标代码类型与此行相关。
方案2:
该断点当前不会被命中。尚未加载任何符号 这份文件。
方案3:
该断点当前不会被命中。源代码不同 来自原始版本。
在调查期间,我很幸运遇到了所有这三个人。
要修复2,请在此处检查:http://www.wwwlicious.com/2016/02/28/how-to-load-debug-symbols-during-debugging/
要修复3,请再次检查文件的版本是否正确。
对于1。根据其描述,我相信调试符号必须已经加载到1中,这与2不同。但是,不知何故,调试符号信息在某处已损坏在中间,这会导致某些功能的断点正常,而其他功能则差。
根据错误描述,可能有两个最可能的原因:
我现在专注于编译器优化。
我将/Od
的{{1}}设置为disable optimization。
我将cl.exe
的{{1}}设置为禁用whole program optimization。
我删除了/GL-
以禁用link time code generation,这也是一种全程序优化。
似乎仍然无法正常工作。
(最后,我妈妈的祝福挽救了这一天!)
根本原因是行尾样式!
Visual Studio一直提示我输入包含无法到达的断点的C文件。如下:
我将行尾标准化后,所有断点现在都可以正常工作!
以下是以前无法到达的断点。
顺便说一句,我真的没想到Microsoft Visual Studio会严格遵守cl.exe
风格。
多一点良性/智慧是否有害?