32

我希望 C 程序在某些情况下生成核心转储。这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码。另外,由于它是在生产环境中,我不想调用 abort()。正在调查的问题在非生产环境中不容易复制。我希望程序在检测到某些问题时自行生成核心转储,最好有足够的信息来重命名文件,然后继续。

4

5 回答 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 回答