【发布时间】:2017-05-08 14:38:57
【问题描述】:
我正在尝试找出一种方法来在发生崩溃时获取已部署的 c++ 应用程序的堆栈跟踪。我尝试了几种方法,我认为我的问题与发生异常后的堆栈有关。
我在 Qt 中创建了一个测试应用程序。这是代码。
void miniDumpFunc()
{
MiniDump dump;
dump.Create(L"C:\\dmp\\dmp.dmp");
}
void anotherFunc()
{
miniDumpFunc();
}
LONG WINAPI OurCrashHandler(EXCEPTION_POINTERS * /*ExceptionInfo*/)
{
miniDumpFunc();
return EXCEPTION_EXECUTE_HANDLER;
}
void badFunc()
{
int *myNull = NULL;
*myNull = 42;
}
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
::SetUnhandledExceptionFilter(OurCrashHandler);
anotherFunc();
return app.exec();
}
如果我调用 anotherFunc() 然后查看 WinDbg 中的堆栈跟踪,我会得到以下堆栈。
我认为这里有一些内联,但看起来是正确的。
堆栈跟踪从 UnhandledExceptionFilter 开始。堆栈似乎被异常弄乱了。
这是我获得生成迷你转储的代码的地方。 http://blog.aaronballman.com/2011/05/generating-a-minidump/
【问题讨论】:
-
如果您不将
EXCEPTION_POINTERS传递给MiniDumpWriteDump,则无法从引发 SEH 异常的代码开始编写转储。传递这些(使用nullptr,以防您想在不处理异常的情况下编写转储)。关于您正在使用的实现的警告:这将在某些时候死锁。您绝对肯定想在自己的进程中调用MiniDumpWriteDump。 -
您链接到的文章(和实现)是如此破碎,无法再生,我强烈建议您编写自己的文章(来自可靠的信息,如DebugInfo.com)。就此而言,作者完全不知道他在做什么,或者他正在使用的 API 做了什么(例如,
MiniDumpWriteDump已经暂停了所有线程)。保持清醒。
标签: c++ qt winapi exception-handling dump