【发布时间】:2015-10-16 20:13:44
【问题描述】:
我一直在尝试让 Windows 应用程序在发生崩溃(错误的内存访问或被零除)或标准 c++ 异常时转储调用堆栈。
我已经构建了 StackWalker 并将其链接到我的应用程序中,并使用 /EHa 编译了我的应用程序。
#include "win/StackWalker.h"
extern int runapp(int argc, char **argv);
// The exception filter function:
LONG WINAPI ExpFilter(EXCEPTION_POINTERS* pExp, DWORD dwExpCode) {
StackWalker sw;
sw.ShowCallstack(GetCurrentThread(), pExp->ContextRecord);
return EXCEPTION_EXECUTE_HANDLER;
}
int main(int argc, char *argv[]) {
__try
{
return runapp(argc, argv);
}
__except (ExpFilter(GetExceptionInformation(), GetExceptionCode()))
{
}
}
真正的程序是通过 runapp() 启动的,因为无法在 __try 范围内直接实例化需要展开(销毁)的对象。
我的问题是,当我使用此代码强制我的程序崩溃时,什么都没有发现:
int *data1 = 0;
*data1 = 0;
换句话说,它只是“正常”崩溃
有人有提示吗?
【问题讨论】:
-
对于它的价值,我对此进行了测试,并且确实为我捕获了异常。
-
好的。我正在调查下面 Ari0nhh 的答案。他提到您必须单独处理线程。我生成的崩溃肯定在另一个线程中。所以也许我的代码可以工作,但不是在多线程中。
标签: c++ windows debugging callstack