【问题标题】:Memory Dump not being written in C++ Release mode内存转储未以 C++ 释放模式编写
【发布时间】:2023-03-22 17:35:02
【问题描述】:

我一直在使用 http://www.codeproject.com/Articles/1934/Post-Mortem-Debugging-Your-Application-with-Minidu 从我的应用程序中获取一个转储文件,该文件总是在另一个系统上崩溃。

所以我所拥有的是头文件和 CPP 并处于调试模式,但没有附加调试器,它询问我是否要创建 dmp 文件,然后崩溃,但在发布模式下,它只是崩溃。

基本上我一直在使用的代码是

void IndexFault(int n)
{
    unsigned char* smallArray = new unsigned char[4];
    printf((const char*)smallArray[n]);
}

MiniDumper* mDump = new MiniDumper("Dumpfile");

int main()
{
    IndexFault(4);
    return 0;
}

再次,如果执行从调试模式创建的 exe,我得到的文件就好了,释放我什么也得不到。在这两种情况下都是 64 位代码。一旦它起作用,我将把它应用到我的真实代码中,但到目前为止,我无法弄清楚发生了什么。我使用的 Minidumpwriter 来自上述网站。

【问题讨论】:

  • 在您链接的页面中:只提到了 Windows XP 和 2000,并且转储程序似乎只适用于例外情况。这就引出了一个问题:你确定它应该工作吗?
  • 不,我不知道,但它绝对适用于调试。
  • 我不是 VC++ 方面的专家,但很可能 Debug 模式包含额外的检查(例如边界检查),而 Release 模式中不包含这些检查(出于性能原因),并且您的代码可能依赖于这样的测试。
  • 我会使用这个MiniDumper 并将它的皮肤保留到仍然会创建转储的最小行。然后看看这是否适用于发布模式。如果它在 Debug 中有效,但在 Release 中无效,您可以尝试将 Debug 慢慢转为 Release:启用优化、设置 NDEBUG 等。您也可以尝试调试 Release。如果一切都失败了,请在此处发布蒙皮代码,以便我们查看。

标签: c++ exception-handling crash-dumps


【解决方案1】:

我相信你错过了这一步:

要调用 API,您需要通过使用 SetUnhandledExceptionFilter API 设置未处理的异常处理程序来捕获崩溃。这允许在应用程序中几乎任何时候发生未处理的异常时调用过滤器函数。在某些未处理的异常中,例如双堆栈错误,操作系统将立即终止应用程序,而不调用过滤器或 JIT 调试器

无论如何,我个人更喜欢在这种情况下使用 WinDbg。只需使用它附加到远程进程并获取该转储。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 2011-02-12
    • 1970-01-01
    • 2012-08-29
    • 2011-07-21
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    相关资源
    最近更新 更多