【发布时间】:2017-11-25 23:11:58
【问题描述】:
在 Windows 中,我有一些线程。其中两个以异常终止(例如,空指针取消引用)。我有SetUnhandledExceptionFilter(...),它在第一个异常时开始生成转储。在第二个异常中,整个程序都死掉了。有没有办法处理这种情况?应忽略除第一个以外的所有严重错误。
伪代码:
void job()
{
...
RaiseException(someCode, someFlags, 0, nullptr); // or doing something wrong, like nullptr dereference
}
int main() {
SetUnhandledExceptionFilter(getDump);
std::thread t1(job), t2(job);
...
}
UPD:替换误解的字符串 *nullptr = 0xbad;
UPD2:忘记 nullptr
UPD3:到目前为止,我找到了这个解决方法
#include <stdio.h>
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
#include <mutex>
LONG __stdcall HandleException(EXCEPTION_POINTERS* exinfo)
{
static HANDLE mutex = CreateMutex(nullptr, FALSE, __TEXT("HandleException"));
while(WaitForSingleObject(mutex, INFINITE) != WAIT_OBJECT_0);
HANDLE event = CreateEvent(nullptr, TRUE, FALSE, __TEXT("Doing Dump"));
puts("Doing Dump");
WaitForSingleObject(event, 5000); // do dump routine
puts("Done Dump");
return EXCEPTION_EXECUTE_HANDLER;
}
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep)
{
puts("in filter.");
return HandleException(ep);
}
void Job()
{
puts("hello");
int *p = 0x00000000; // pointer to NULL
*p = 13; // causes an access violation exception;
}
void safeJob(void (*job)())
{
__try {
job();
} __except (filter(GetExceptionCode(), GetExceptionInformation())) {
exit(-1);
}
}
int main()
{
SetUnhandledExceptionFilter(HandleException);
std::thread t1(std::bind(safeJob, Job));
std::thread t2(std::bind(safeJob, Job));
t1.join();
t2.join();
return 0;
}
【问题讨论】:
-
听起来像是
getDump中的一个错误。请出示您的实际代码。 -
nullptr取消引用不一定会引发异常,这是未定义的行为。 -
我不知道取消引用
nullptr会引发异常的任何系统。它要么因段错误而崩溃,要么什么都不做(尽管它可以做任何事情,因为它是 UB)。 -
取消引用
std::nullptr_t是一个编译错误,应该类似于*(int*)nullptr = 0xbad -
@Kevin:那个系统叫做“Windows”。 winapi 标签应该已经暗示了这一点。实际上,这个系统被称为 Intel x86。您在英特尔(和兼容设备)上所说的“段错误”是 CPU 生成 exception(如果我没记错的话是 GPF),而 Windows 实际上保留了该术语。
标签: c++ winapi exception-handling seh