dar*_*une 5 c++ exception terminate visual-c++ c++17
我正在尝试改进异常诊断(更像是基本的崩溃处理),对于某些情况SetUnhandledExceptionFilter(https://msdn.microsoft.com/en-us/library/windows/desktop/ms680634(v=vs.85).aspx)不'似乎有助于捕获致命错误。这种情况是当关闭并且不同的 atexit 函数和单例析构函数等正在运行(清理)时。另外,析构函数由于 noexcept 声明不匹配而终止的情况也值得关注。
使用AddVectoredExceptionHandler(https://msdn.microsoft.com/en-us/library/windows/desktop/ms679274(v=vs.85).aspx)确实似乎是一个不错的选择,因为它的功能更像是调试器的“第一次机会”异常”,但是它也因此在太多情况下被调用(还有正常异常、某些信号等)。
好吧,您可以做的是添加向量化异常处理程序,但实际上并不检查那里的异常,而是将其存储在某处(将线程 ID 映射到异常信息的某些部分的映射)并安装您的终止处理程序 - 如果它被调用,那么您就知道地图中的异常之一是错误的。为了避免保留过多的数据,请添加一个线程本地 raii 类,一旦线程退出,该类就会从映射中删除条目。当然,这会对性能造成影响(在每次异常时锁定地图),但如果这确实是您想要的,那么这是一种有效的方法。
通用代码:
#include <exception>
#include <iostream>
#include <thread>
#include <Windows.h>
void termination_handler()
{
// Look at the map, you will not know which one caused it but at least have all of them
std::cout << "termination_handler called\n";
}
LONG VectoredExceptionHandler(_EXCEPTION_POINTERS *ExceptionInfo)
{
// Put exception record somewhere - e.g map of thread ids to to exception record, maybe symbols
return EXCEPTION_CONTINUE_SEARCH;
}
void foo()
{
throw std::exception();
}
int main(int argc, char** argv)
{
AddVectoredExceptionHandler(0, VectoredExceptionHandler);
std::set_terminate(termination_handler);
std::thread t(foo);
t.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2750 次 |
| 最近记录: |