我希望 C 程序在某些情况下生成核心转储。这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码。另外,由于它是在生产环境中,我不想调用 abort()。正在调查的问题在非生产环境中不容易复制。我希望程序在检测到某些问题时自行生成核心转储,最好有足够的信息来重命名文件,然后继续。
问问题
12987 次
5 回答
61
void create_dump(void)
{
if(!fork()) {
// Crash the app in your favorite way here
*((void*)0) = 42;
}
}
分叉进程然后让孩子崩溃——它会在你想要的时候给你一个快照
于 2008-09-25T04:56:38.350 回答
6
另一种方法可能是使用Google Coredumper库。这会产生与 fork+abort 技术类似的结果,但在多线程应用程序中表现更好(在分叉之前暂停所有线程一段时间,以免它们在子进程中造成混乱)。
例子:
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* 继续,我们生成了一个核心文件, * 但我们没有崩溃。 */
于 2014-07-10T09:21:29.307 回答
4
Sun在此处描述了如何在 Solaris、HP-UX、Redhat 和 Windows 上获取核心文件。
Solaris 有 gcore 程序。HP-UX 可能有它。否则使用 gdb 及其 gcore 命令。Windows 有 win-dbg-root\tlist.exe 和 win-dbg-root\adplus.vbs
于 2008-09-25T04:30:13.610 回答
3
你真的想要一个核心,还是只是一个堆栈跟踪?如果你想要的只是一个堆栈跟踪,你可以在这里查看开源并尝试从那里集成代码,或者只是从命令行调用它就足够了。
我相信 gdb 项目中的一些代码也可能有用。
您可能想要做的另一个想法是使用 gdb 附加到正在运行的进程。
$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
于 2008-09-25T04:33:44.070 回答
2
生成核心转储的源代码位于“gcore”中,它是 gdb 包的一部分。
此外,Sun 有gcore。
此外,您必须有一个单独的进程运行核心转储,因为当前进程必须暂停。您可以在 gcore 源代码中找到详细信息,或者您可以将您的进程作为目标运行平台的 gcore。
于 2008-09-25T04:21:55.017 回答