【发布时间】: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