我的C++程序有一个嵌入式Web服务器(基于AA>)。如果在处理http请求时发生异常,我希望不会崩溃,但也希望触发核心转储以供将来调试。
这是我目前的尝试。
// See http://stackoverflow.com/a/131539/25507
void create_dump(void)
{
if(!fork()) {
abort() || (*((void*)0) = 42);
}
}
void HandleHttpRequest(mg_conn *conn)
{
try {
// Lots of application-specific logic
} catch (std::exception& e) {
create_dump();
WriteHttp500(conn);
}
}
这基本上是可行的。但是,如果我随后启动gdb来对核心转储执行死后调试会话,那么堆栈跟踪位于
create_dump()
的HandleHttpRequest
行。如果我有一个
catch
块的核心转储,有没有办法查看引发异常的堆栈跟踪?或者是否有更好的方法来实现我的目标(自动将未发现的异常转换为http 500错误代码,同时为它们捕获完整的调试信息)?
最佳答案
没有一种便携的方法可以实现你想要的。
不可移植的方法是从extern "C" void __cxa_throw(void *, void *, void *)
插入libstdc++.so
函数,并在从libstdc++.so
调用原始函数之前从中转储核心。
关于如何进行这种插入的更多信息是here。
笔记:
只有当您链接到libstdc++.so
(通常应该这样做)而不是libstdc++.a
时,这才有效。
您不必使用LD_PRELOAD
,您可以将插入器放入主可执行文件。
使用fork()
来转储内核是非常繁重的工作,对于多线程程序来说不太好(好吧,根本不起作用)。使用google elfcoredumper可能会更好。
关于c++ - 来自核心转储的异常回溯,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35995654/