我的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/

10-16 05:08