1

环境:我有一个引用一些 Visual C++ 项目的 .NET 4.0 解决方案。视觉工作室 2010。

如果我构建我的解决方案并直接从 bin 目录运行生成的 .exe,我可以重现我的错误。但是,如果我在 Visual Studio 中点击“播放”按钮运行它(或者如果我运行该进程并附加到它),我可以单步执行代码,一切正常。

作为参考,我遇到的问题是访问冲突,这肯定是在 C++ 代码中发生的。

但更广泛地说,我想知道将调试器附加到进程“修复”问题的其他原因可能是什么。

4

3 回答 3

3
  • MS VS 像沙盒一样工作。当您在该沙箱中启动应用程序时,您的程序会从解决方案属性(或仅 VS 设置)继承所有设置。确保为环境提供的所有选项都是正确的。如果这不能解决问题,请仔细检查这些设置并考虑什么可以防止访问冲突并取消选中/选中它。

  • 如果您使用的是外部 DLL,那么来自您系统的那些和来自 IDE 的那些可能有不同的版本。当然,它们可能在这两种情况下都有效,但也可能导致访问冲突或订阅超出范围等问题,具体取决于这些 dll 内部的更改。

  • 如果是 Windows 应用程序,请尝试启用/禁用LargeAddressAware.

  • 如果您正在为另一台具有不同操作系统的机器编译东西,由于本机操作系统的内存处理变化,它可能经常发生。内存有时可能是多块的、极度碎片化的,甚至是多设备的,因此只能使用专门为目标操作系统/机器进行的编译来编译程序

  • 调试模式使用 assert() 和其他直接链接到调试的东西。如果在调试中出现问题而不是在发布中出现问题,则意味着机器可以接受,但调试插入不能接受。在那种情况下,你搞砸了,但如果它在其他调试器中似乎没有问题,那么......问题解决了,它的调试器问题,特别是如果没有调试选项的发布工作正常。

  • 最累人的方法 - 尝试查明访问冲突地址并查看内存窗口内部您所指的内容。

  • 在其他情况下,请向我们提供代码片段,以便我们提供更多信息!


@Matt 这不可能是堆问题,它可能会发生,但极为罕见。

@Huytard 它不会发生,没有链接的 dll 的程序甚至不应该启动。

于 2013-11-06T17:12:10.513 回答
1

正确而简短的答案。运行 Windows 更新。

正确而冗长的答案。

事实证明,我的构建机器有一段时间没有更新,并且使用的是过时版本的 Visual C++ 编译器。.NET 4 的编译器中存在一个错误,其中静态构造函数没有在任何其他类型的构造函数之前被首先调用(仅在发布模式下)。

但这是踢球者!如果您在 Visual Studio 调试器中运行该进程,或者附加到远程进程。静态构造函数确实会像他们应该的那样首先被调用!(因此使问题在调试环境中完全无法重现——即使在发布模式下)我通过在各处放置消息框以确定代码路径来发现问题。

http://connect.microsoft.com/VisualStudio/feedback/details/611716/c-cli-class-static-constructor-not-called-in-release-build

于 2013-11-11T23:47:38.273 回答
0
  1. 运行绿色的“播放”按钮将使用IDE 的环境
  2. 从目录执行将使用默认环境

我的猜测是,可能需要将一些 DLL 或依赖项(目录路径)添加到您的 %PATH% 环境变量中。

一旦您确定了依赖项并仔细检查或使用依赖项walker进行检查- 您可以在批处理脚本中设置它们,然后调用您的应用程序。

例如:

@echo off
set PATH=%PATH%;C:\myLibs
call MyApp.exe
于 2013-11-06T17:03:07.367 回答