VS2015 C 调试问题:当前不会命中断点。没有可执行代码与此行关联
VS2015 C debugging issue: Breakpoint will not currently be hit. No executable code is associated with this line
我正在用 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
当我调试整个应用程序时,我遇到了以下 some 断点 的错误在库中.
所以我做了一些实验。
在有上述问题的 .c
文件中,我尝试将断点对添加到 beginning 大括号和 ending 所有 该文件中的 C 函数的括号。
我注意到对于某些函数,断点对可以命中。如下所示:
但是后来我遇到了一个函数,在结束括号处的断点不能被打。如下所示:
并且所有后续函数都遇到同样的问题。
我检查了这个thread。
我试过干净重建,没有用。
我使用 /Z7
所以没有 PDB 文件。 我猜所有调试信息都嵌入在 lib 文件中。
我有 /Od
所以 我想 优化不妨碍我。
那有什么问题吗?
任何人都可以解释一下吗?谢谢。
(这还不是答案。现在是答案。我post我调查到这里所以原来的post不会太长。)
尝试 1
我尝试使用 /Zi
作为我的库。它会生成一个 vc140.pdb
文件。 (顺便说一句,lib 文件的大小比 /Z7
的情况小很多)
然后我调试我的应用程序。我尝试将此 vc140.pdb
文件放入符号文件 window 中,如下所示:
但是没有用。 (这是意料之中的,因为 VS2015 怎么知道这个 pdb 文件是用于静态链接库的,它现在只是可执行文件的一部分。)
尝试 2
有3个类似的断点不能打的场景。
场景 1:
The breakpoint will not currently be hit. No executable code of the
debugger's target code type is associated with this line.
场景 2:
The breakpoint will not currently be hit. No Symbols have been loaded
for this document.
场景 3:
The breakpoint will not currently be hit. The source code is different
from the original version.
在调查过程中,我有幸遇到了他们3人。
要修复 2,请查看此处:http://www.wwwlicious.com/2016/02/28/how-to-load-debug-symbols-during-debugging/
要修复 3,请仔细检查您的文件版本是否正确。
对于 1。根据它的描述,我相信调试符号一定是在 1 中加载的,这与 2 不同。但是不知何故,调试符号信息在中间某处损坏,这会导致某些功能的断点正常,而其他功能则不好。
尝试 3
根据错误描述,最可能的原因有2个:
- 条件编译
- 编译器优化
我现在专注于编译器优化。
我将 cl.exe
的 /Od
设置为 disable optimization。
我为 cl.exe
设置了 /GL-
以禁用 whole program optimization。
我去掉了/LTCG
来禁用link time code generation,这也是一种全程序优化
似乎还是不行。
尝试 4 --- 问题已解决!!!
(终于有妈妈的祝福化险为夷了!)
根本原因原来是行尾风格!
Visual Studio 一直提示我输入包含无法到达的断点的 C 文件。如下:
在我规范化行尾之后,所有断点现在都可以正常工作了!
下面是以前无法到达的断点。
顺便说一句,我真的没想到微软Visual Studio坚持CR LF
风格所以严格。
多一点疼吗benign/intelligent?
我正在用 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
当我调试整个应用程序时,我遇到了以下 some 断点 的错误在库中.
所以我做了一些实验。
在有上述问题的 .c
文件中,我尝试将断点对添加到 beginning 大括号和 ending 所有 该文件中的 C 函数的括号。
我注意到对于某些函数,断点对可以命中。如下所示:
但是后来我遇到了一个函数,在结束括号处的断点不能被打。如下所示:
并且所有后续函数都遇到同样的问题。
我检查了这个thread。
我试过干净重建,没有用。
我使用 /Z7
所以没有 PDB 文件。 我猜所有调试信息都嵌入在 lib 文件中。
我有 /Od
所以 我想 优化不妨碍我。
那有什么问题吗?
任何人都可以解释一下吗?谢谢。
(这还不是答案。现在是答案。我post我调查到这里所以原来的post不会太长。)
尝试 1
我尝试使用 /Zi
作为我的库。它会生成一个 vc140.pdb
文件。 (顺便说一句,lib 文件的大小比 /Z7
的情况小很多)
然后我调试我的应用程序。我尝试将此 vc140.pdb
文件放入符号文件 window 中,如下所示:
但是没有用。 (这是意料之中的,因为 VS2015 怎么知道这个 pdb 文件是用于静态链接库的,它现在只是可执行文件的一部分。)
尝试 2
有3个类似的断点不能打的场景。
场景 1:
The breakpoint will not currently be hit. No executable code of the debugger's target code type is associated with this line.
场景 2:
The breakpoint will not currently be hit. No Symbols have been loaded for this document.
场景 3:
The breakpoint will not currently be hit. The source code is different from the original version.
在调查过程中,我有幸遇到了他们3人。
要修复 2,请查看此处:http://www.wwwlicious.com/2016/02/28/how-to-load-debug-symbols-during-debugging/
要修复 3,请仔细检查您的文件版本是否正确。
对于 1。根据它的描述,我相信调试符号一定是在 1 中加载的,这与 2 不同。但是不知何故,调试符号信息在中间某处损坏,这会导致某些功能的断点正常,而其他功能则不好。
尝试 3
根据错误描述,最可能的原因有2个:
- 条件编译
- 编译器优化
我现在专注于编译器优化。
我将 cl.exe
的 /Od
设置为 disable optimization。
我为 cl.exe
设置了 /GL-
以禁用 whole program optimization。
我去掉了/LTCG
来禁用link time code generation,这也是一种全程序优化
似乎还是不行。
尝试 4 --- 问题已解决!!!
(终于有妈妈的祝福化险为夷了!)
根本原因原来是行尾风格!
Visual Studio 一直提示我输入包含无法到达的断点的 C 文件。如下:
在我规范化行尾之后,所有断点现在都可以正常工作了!
下面是以前无法到达的断点。
顺便说一句,我真的没想到微软Visual Studio坚持CR LF
风格所以严格。
多一点疼吗benign/intelligent?