【发布时间】:2016-06-29 23:17:23
【问题描述】:
我的 C++ 程序有一个嵌入式 Web 服务器(基于 CivetWeb)。如果在处理 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 对核心转储进行事后调试会话,则堆栈跟踪位于 HandleHttpRequest 的 create_dump() 行。
如果我有一个catch 块的核心转储,有没有办法查看引发异常的堆栈跟踪?
或者有没有更好的方法来实现我的目标(自动将未捕获的异常转换为 HTTP 500 错误代码,同时为它们捕获完整的调试信息)?
【问题讨论】:
-
您真的需要核心转储,还是可以运行自定义展开器来收集回溯?这应该是用于调试的大量信息。
-
@KerrekSB - 核心转储是理想的,但自定义展开器肯定比没有好。您是否有任何关于编写可以从 catch 块访问异常堆栈跟踪的信息的起点? (我尝试了简短的 Google 搜索,但不清楚如何继续。)
-
如果您能够并且愿意更改抛出的异常类型,那么我会研究 boost 异常,请参阅 stackoverflow.com/questions/691719/…
-
还要记住,堆栈跟踪可能在优化的构建中因为帧指针遗漏而无用
-
我想到了像 libunwind 这样的东西......
标签: c++ linux exception gdb core