环境:我有一个引用一些 Visual C++ 项目的 .NET 4.0 解决方案。视觉工作室 2010。
如果我构建我的解决方案并直接从 bin 目录运行生成的 .exe,我可以重现我的错误。但是,如果我在 Visual Studio 中点击“播放”按钮运行它(或者如果我运行该进程并附加到它),我可以单步执行代码,一切正常。
作为参考,我遇到的问题是访问冲突,这肯定是在 C++ 代码中发生的。
但更广泛地说,我想知道将调试器附加到进程“修复”问题的其他原因可能是什么。
环境:我有一个引用一些 Visual C++ 项目的 .NET 4.0 解决方案。视觉工作室 2010。
如果我构建我的解决方案并直接从 bin 目录运行生成的 .exe,我可以重现我的错误。但是,如果我在 Visual Studio 中点击“播放”按钮运行它(或者如果我运行该进程并附加到它),我可以单步执行代码,一切正常。
作为参考,我遇到的问题是访问冲突,这肯定是在 C++ 代码中发生的。
但更广泛地说,我想知道将调试器附加到进程“修复”问题的其他原因可能是什么。
MS VS 像沙盒一样工作。当您在该沙箱中启动应用程序时,您的程序会从解决方案属性(或仅 VS 设置)继承所有设置。确保为环境提供的所有选项都是正确的。如果这不能解决问题,请仔细检查这些设置并考虑什么可以防止访问冲突并取消选中/选中它。
如果您使用的是外部 DLL,那么来自您系统的那些和来自 IDE 的那些可能有不同的版本。当然,它们可能在这两种情况下都有效,但也可能导致访问冲突或订阅超出范围等问题,具体取决于这些 dll 内部的更改。
如果是 Windows 应用程序,请尝试启用/禁用LargeAddressAware
.
如果您正在为另一台具有不同操作系统的机器编译东西,由于本机操作系统的内存处理变化,它可能经常发生。内存有时可能是多块的、极度碎片化的,甚至是多设备的,因此只能使用专门为目标操作系统/机器进行的编译来编译程序
调试模式使用 assert() 和其他直接链接到调试的东西。如果在调试中出现问题而不是在发布中出现问题,则意味着机器可以接受,但调试插入不能接受。在那种情况下,你搞砸了,但如果它在其他调试器中似乎没有问题,那么......问题解决了,它的调试器问题,特别是如果没有调试选项的发布工作正常。
最累人的方法 - 尝试查明访问冲突地址并查看内存窗口内部您所指的内容。
在其他情况下,请向我们提供代码片段,以便我们提供更多信息!
@Matt 这不可能是堆问题,它可能会发生,但极为罕见。
@Huytard 它不会发生,没有链接的 dll 的程序甚至不应该启动。
正确而简短的答案。运行 Windows 更新。
正确而冗长的答案。
事实证明,我的构建机器有一段时间没有更新,并且使用的是过时版本的 Visual C++ 编译器。.NET 4 的编译器中存在一个错误,其中静态构造函数没有在任何其他类型的构造函数之前被首先调用(仅在发布模式下)。
但这是踢球者!如果您在 Visual Studio 调试器中运行该进程,或者附加到远程进程。静态构造函数确实会像他们应该的那样首先被调用!(因此使问题在调试环境中完全无法重现——即使在发布模式下)我通过在各处放置消息框以确定代码路径来发现问题。