【问题标题】:How can a C program produce a core dump of itself without terminating?C 程序如何在不终止的情况下生成自身的核心转储?
【发布时间】:2008-09-25 04:11:05
【问题描述】:

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

【问题讨论】:

    标签: c debugging coredump


    【解决方案1】:
    void create_dump(void)
    {
        if(!fork()) {
            // Crash the app in your favorite way here
            *((void*)0) = 42;
        }
    }
    

    fork 进程,然后让子进程崩溃——它会随时为您提供快照

    【讨论】:

    • 哦,这太棒了 - 我总是不得不 raise(6) 并重新启动该过程。
    • 这会杀死父级。孩子从 fork() 返回 0。
    • 我的阅读表明分叉的孩子只获得当前线程,而不是任何其他线程。这意味着您的核心转储将仅包含有关当前线程的信息 - 而不是您正在运行的任何其他线程。如果你需要所有线程,你可以使用这个:code.google.com/p/google-coredumper
    • 如果 abort dosen 不返回而不是为什么或
    • || (*((void*)0) = 42)是什么意思?
    【解决方案2】:

    另一种方法可能是使用Google Coredumper 库。这会产生与 fork+abort 技术类似的结果,但与多线程应用程序配合得更好(在 fork 之前暂停所有线程一段时间,以免它们在子进程中造成混乱)。

    例子:

    #include ... WriteCoreDump('core.myprogram'); /* 继续,我们生成了一个核心文件, * 但我们没有崩溃。 */

    【讨论】:

      【解决方案3】:

      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】:

        你真的想要一个核心,还是只是一个堆栈跟踪? 如果你想要的只是一个堆栈跟踪,你可以看看开源 here 并尝试从那里集成代码,或者只是从命令行调用它就足够了。

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

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

        $ gdb /path/to/exec 1234 # 1234 is the pid of the running process
        

        【讨论】:

        【解决方案5】:

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

        另外,太阳也有gcore

        此外,您必须有一个单独的进程运行核心转储,因为当前进程必须暂停。您可以在 gcore 源代码中找到详细信息,或者您可以将您的进程作为目标运行平台的 gcore。

        【讨论】:

          猜你喜欢
          • 2011-01-11
          • 1970-01-01
          • 2022-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-09
          • 1970-01-01
          相关资源
          最近更新 更多