我在Visual Studio中有一个项目,我已经工作了一段时间,我已经广泛使用了调试器。最近我改变了一些设置,我失去了停止程序和单步执行代码的能力。我无法弄清楚我所改变的可能会对此产生什么影响。
如果我在代码中设置断点并尝试让程序停在那里,那就不行了。断点显示白色,红色轮廓。如果我将鼠标悬停在它上面,它说 “断点当前不会被命中。调试器的目标代码类型的可执行代码与此行没有关联。可能的原因包括:条件编译,编译器优化或当前调试器代码类型不支持此行的目标体系结构。“
我知道程序执行断点所在的代码是因为我将断点放在InitializeComponent方法的开头。程序显示窗口正常,但不会在断点处停止。是的,我正在调试模式下运行。
似乎编译代码与显示的源代码之间存在脱节。有谁知道那会是什么,或者知道我应该检查哪些编译器设置来重新启用调试?
以下是编译器选项:
/ GS / analyze- / W3 / Zc:wchar_t /I"D:\dev\libcurl-7.19.3-win32-ssl-msvc\include“/ Zi / Od / sdl /Fd"Debug\vc110.pdb“/ fp:precise / D”WIN32“/ D”_DEBUG“/ D”_UNICODE“ / D“UNICODE”/ errorReport:prompt / WX- / Zc:forScope / Oy- / clr / FU“C:\ Program Files(x86)\ Reference 大会\微软\ Framework.NETFramework \ V4.5 \ mscorlib.dll中” / FU“C:\ Program Files(x86)\ Reference 大会\微软\ Framework.NETFramework \ V4.5 \ System.Data.dll中” / FU“C:\ Program Files(x86)\ Reference 大会\微软\ Framework.NETFramework \ V4.5 \ System.dll中” / FU“C:\ Program Files(x86)\ Reference 大会\微软\ Framework.NETFramework \ V4.5 \ System.Drawing.dll程序” / FU“C:\ Program Files(x86)\ Reference 大会\微软\ Framework.NETFramework \ V4.5 \ System.Windows.Forms.DataVisualization.dll” / FU“C:\ Program Files(x86)\ Reference 大会\微软\ Framework.NETFramework \ V4.5 \ System.Windows.Forms.dll的” / FU“C:\ Program Files(x86)\ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.5 \ System.Xml.dll“/ MDd / Fa“Debug \”/ EHa / nologo / Fo“Debug \”/Fp"Debug\Prog.pch“
链接器选项为:
/ OUT:“D:\ dev \ Prog \ Debug \ Prog.exe”/ MANIFEST / NXCOMPAT /PDB:"D:\dev\Prog\Debug\Prog.pdb“/ DYNAMICBASE”curllib.lib“ “winmm.lib”“kernel32.lib”“user32.lib”“gdi32.lib”“winspool.lib” “comdlg32.lib”“advapi32.lib”“shell32.lib”“ole32.lib”“oleaut32.lib” “uuid.lib”“odbc32.lib”“odbccp32.lib”/固定:否/调试/机器:X86 / ENTRY:“Main”/ INCREMENTAL /PDD:"D:\dev\Prog\Debug\Prog.pgd“ / SUBSYSTEM:WINDOWS / MANIFESTUAC:“level ='asInvoker'uiAccess ='false'” /ManifestFile:"Debug\Prog.exe.intermediate.manifest” / ERRORREPORT:PROMPT / NOLOGO /LIBPATH:"D:\dev\libcurl-7.19.3-win32-ssl-msvc\lib\Debug” / ASSEMBLYDEBUG / TLBID:1
答案 0 :(得分:0)
不要假装是一个完整的答案,但是 这里有一些想法:
Debug
文件夹,也可能是其他内容。只留下源文件,项目文件和解决方案文件(以及资产,表格,数据库等,如果您使用它)。删除其他构建文件夹也是个好主意,例如Release
。Set as StartUp project
Project Properties - Debugging - Command
Step Into
开始调试。然后点击Show next statement
。如果它不会进入main()
真正破碎的东西;(以后如何预防:
为了防止在这种情况下造成时间损失,代码丢失和挫折,程序员使用Version control systems。它们允许以递增方式保存编码结果,您可以快速比较任意两个步骤,观察更改内容,并在需要时回滚。
最受欢迎的系统是:Subversion(SVN),Git,Mercurial(Hg)。所有你都可以集成到Visual Studio。
热爱您的代码,永不松散/破坏您的工作成果!
希望它有所帮助。快乐的编码! =)
答案 1 :(得分:0)
我遇到了类似的问题,通过将链接器选项“Debugging / Generate Debug Info”设置为“Yes(/ DEBUG)”解决了这个问题。 (虽然我看到你的链接器选项已经有了这个设置......)
答案 2 :(得分:0)
我是Visual Studio和C ++的新手,希望能为你提供线索。我的表达很差,所以我选择使用代码来表明我的痛苦。
#include <stdio.h>
#include <iostream>
class Circle
{
public:
int x;
Circle() {
x = 2;
}
};
int main() {
Circle circle;
printf("%p\n", &circle);
printf("yyy\n");
system("pause");
return 0;
}
这是一个非常简单的例子。但是如果你在main(){}中放置一个break指针(系统之前的任何一行(&#34; pause&#34;)),那么调试它。如前所述,它会警告你
当前不会触发断点。调试器的目标代码类型的可执行代码与此行无关。 可能的原因包括:当前调试器代码类型不支持此行的目标体系结构的条件编译,编译器优化。
但是,如果你将类Circle放在.h中,它将允许你调试main()。代码如下: Header.h
class Circle
{
public:
int x;
Circle() {
x = 1;
}
};
Source.cpp
#include <stdio.h>
#include <iostream>
#include "Header.h"
int main() {
Circle circle;
printf("%p\n", &circle);
printf("yyy\n");
system("pause");
return 0;
}
它的构造者制作了一个技巧。
答案 3 :(得分:0)
当编译器执行自动优化时,此行为是可行的。 您可以尝试禁用编译器优化并重新运行。
选择Project Properties -> C/C++ -> Optimization
。
在优化中,选择选项Disabled (/Old)
。