c++ - 是什么导致 Visual Studio 调试器使某些问题无法重现?

标签 c++ .net visual-studio-2010 visual-studio debugging

环境:我有一个引用了一些 Visual C++ 项目的 .NET 4.0 解决方案。 Visual Studio 2010。

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

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

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

最佳答案

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

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

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

  • 如果您正在为另一台具有不同操作系统的机器编译内容,由于 native 操作系统对内存处理的更改,这种情况可能会经常发生。内存有时可能是多 block 的、极度碎片化的甚至是多设备的,所以只用专门为目标操作系统/机器编译的程序来编译你的程序

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

  • 最累人的方法 - 尝试查明访问冲突地址并在内存窗口内查看您指的是什么。

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


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

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

关于c++ - 是什么导致 Visual Studio 调试器使某些问题无法重现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19817832/

相关文章:

c++ - rcpp 使用第三方库 Kvaser kvmlib

c# - Linq 从数据库表中选择,其中匹配属性来自列表

css - 任何值为 'inherit' 的 CSS 属性上的 ReSharper 错误

visual-studio-2010 - 为什么 ReSharper 的测试运行器会忽略 ExpectedException?

c++ - 处理STL容器的大小

c++ - 具有单个参数的模糊构造函数 : initializer_list and int

c++ - Arduino 的新运算符(operator)

c# - String.Format 计算预期参数的数量

c# - Windows 窗体中标签的自动换行

windows - Visual Studio 构建后 : keep console open?