在堆栈溢出的情况下,您将需要处理一小部分堆栈。堆栈足够启动一个新线程,该线程将拥有一个全新的堆栈。从那里,您可以在终止之前做任何您需要做的事情。
您无法从堆栈溢出中恢复,这将涉及展开堆栈,但您的整个程序将在此过程中被破坏。这是我为堆栈转储实用程序编写的一些代码:
// stack overflows cannot be handled, try to get output then quit
set_current_thread(get_current_thread());
boost::thread t(stack_fail_thread);
t.join(); // will never exit
所有这些都是获取线程的句柄,因此堆栈转储机制知道要转储哪个线程,启动一个新线程来进行转储/记录,并等待它完成(这不会发生,线程调用 @ 987654322@).
为了完整起见,get_current_thread() 看起来像这样:
const HANDLE process = GetCurrentProcess();
HANDLE thisThread = 0;
DuplicateHandle(process, GetCurrentThread(), process,
&thisThread, 0, true, DUPLICATE_SAME_ACCESS);
所有这些都是“简单”的函数,不需要很大的工作空间(请记住,编译器可能会内联这些 msot,删除函数调用)。相反,您不能抛出异常。这不仅需要更多的工作,而且析构函数可以做很多工作(比如释放内存),这往往也很复杂。
最好的办法是启动一个新线程,尽可能多地保存有关应用程序的信息,然后终止。