0

我在 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 "_D​​EBUG" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /Oy- /clr /FU"C:\Program Files (x86)\参考 Assemblies\Microsoft\Framework.NETFramework\v4.5\mscorlib.dll" /FU"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Data.dll" /FU "C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.dll" /FU"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4. 5\System.Drawing.dll" /FU"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\System.Windows.Forms.DataVisualization.dll" /FU"C:\Program Files (x86)\Reference Assemblies\Microsoft\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" /FIXED:NO /DEBUG /MACHINE:X86 /ENTRY:"Main" /INCREMENTAL /PGD:"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

4

4 回答 4

0

不假装是一个完整的答案,但这里有一些想法:

  • 制作项目的备份副本(以防止进一步损坏)
  • 删除所有已编译的二进制文件和目标文件:整个Debug文件夹,也许还有其他东西。只留下源文件、项目文件和解决方案文件(以及资产、表单、数据库等,如果你使用的话)。删除其他构建文件夹也是一个好主意,例如Release.
  • 重建项目
  • 确保调试器启动您期望的项目:右键单击解决方案资源管理器中的项目并选择Set as StartUp project
  • 确保调试器启动您期望的二进制文件:Project Properties - Debugging - Command
  • 关闭在 VS 中打开的所有文件。通过单击解决方案资源管理器重新打开带有断点的源文件。确保带有断点的源文件与编译期间使用的源文件相同:转到源文件夹并双击打开它。比较在编辑器中打开的文件和源文件夹中的文件的路径。还要确保在编译之前保存文件。
  • 尝试使用Step Into. 然后单击Show next statement。如果它不会踏入main()真正破碎的东西;(
  • 如果没有任何帮助,只需创建新项目,将源文件复制到其文件夹中,然后递归地将它们添加到新项目中。

以后如何预防:

为了防止这种情况下的时间损失、代码丢失和挫败感,程序员使用版本控制系统。它们允许以增量方式保存您的编码结果,您可以快速比较任何两个步骤,观察更改的内容,并在需要时回滚。

最流行的系统是:Subversion (SVN)、Git、Mercurial (Hg)。所有这些都可以集成到 Visual Studio。

爱你的代码,永远不要丢失/破坏你的工作结果!

希望能帮助到你。快乐编码!=)

于 2013-11-09T03:49:20.110 回答
0

我有一个类似的问题,通过将链接器选项“调试/生成调试信息”设置为“是(/调试)”来解决。(尽管我看到您的链接器选项中已经设置了此设置...)

于 2014-07-13T12:49:41.083 回答
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(){} (系统(“暂停”)之前的任何行)中放置一个中断指针,则对其进行调试。正如您之前所说,它会警告您

当前不会命中断点。没有调试器目标代码类型的可执行代码与此行相关联。可能的原因包括:条件编译、编译器优化、当前调试器代码类型不支持此行的目标架构。

但是,如果您将类 Circle 放在 .h 中,它将允许您调试 main()。代码如下: Header.h

class Circle
{
public:
    int x;

    Circle() {
        x = 1;
    }
};

源.cpp

#include <stdio.h>
#include <iostream>
#include "Header.h"
int main() {
    Circle circle; 
    printf("%p\n", &circle);
    printf("yyy\n");
    system("pause");
    return 0;
}

它的构造器使一个把戏。

于 2016-12-06T12:46:45.807 回答
0

当编译器进行自动优化时,这种行为是可能的。您可以尝试禁用编译器优化并重新运行。

选择Project Properties -> C/C++ -> Optimization
在优化中,选择选项Disabled (/Old)

于 2016-12-07T08:08:16.110 回答