代码之家  ›  专栏  ›  技术社区  ›  Keet

C程序如何在不终止的情况下产生其核心转储?

  •  30
  • Keet  · 技术社区  · 16 年前

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

    5 回复  |  直到 9 年前
        1
  •  56
  •   Ana Betts    16 年前
    void create_dump(void)
    {
        if(!fork()) {
            // Crash the app in your favorite way here
            abort() || (*((void*)0) = 42);
        }
    }
    

    分叉进程,然后使子进程崩溃-它将在您需要时为您提供快照

        2
  •  6
  •   regnarg    10 年前

    另一种方法可能是使用 Google Coredumper 图书馆。这与fork+abort技术产生了类似的结果,但对多线程应用程序的效果更好(在fork之前暂停所有线程一段时间,这样它们就不会给孩子造成混乱)。

    例子:

        #include <google/coredumper.h>
        ...
        WriteCoreDump('core.myprogram');
        /* Keep going, we generated a core file,
         * but we didn't crash.
         */
    
        3
  •  3
  •   alanc    12 年前

    Sun介绍了如何在Solaris、HP-UX、RedHat和Windows上获取核心文件。 here .

    Solaris有gcore程序。HP-UX可能有。 否则,使用gdb及其gcore命令。 Windows具有win dbg root\tlist.exe和win dbg root\adplus.vbs

        4
  •  3
  •   Box Box Box Box    9 年前

    你真的想要一个核心,还是只是一个stacktrace? 如果您只需要一个stacktrace,您可以查看OpenSource here 尝试从那里集成代码,或者仅仅从命令行调用它就足够了。

    我相信GDB项目中的一些代码也可能有用。

    另一个您可能想要做的是使用gdb连接到正在运行的进程。

    $ gdb /path/to/exec 1234 # 1234 is the pid of the running process
    
        5
  •  1
  •   Box Box Box Box    9 年前

    生成核心转储的源代码位于“gcore”中,它是gdb包的一部分。

    此外,太阳 gcore .

    另外,必须有一个单独的进程运行核心转储,因为当前进程必须挂起。您将在gcore源中找到详细信息,或者您只需以您的进程为目标运行平台的gcore。