【发布时间】:2008-09-25 04:11:05
【问题描述】:
我希望 C 程序在某些情况下生成核心转储。这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码。另外,由于它是在生产环境中,我不想调用 abort()。正在调查的问题在非生产环境中不容易复制。我希望程序在检测到某些问题时自行生成核心转储,最好有足够的信息来重命名文件,然后继续。
【问题讨论】:
我希望 C 程序在某些情况下生成核心转储。这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码。另外,由于它是在生产环境中,我不想调用 abort()。正在调查的问题在非生产环境中不容易复制。我希望程序在检测到某些问题时自行生成核心转储,最好有足够的信息来重命名文件,然后继续。
【问题讨论】:
void create_dump(void)
{
if(!fork()) {
// Crash the app in your favorite way here
*((void*)0) = 42;
}
}
fork 进程,然后让子进程崩溃——它会随时为您提供快照
【讨论】:
|| (*((void*)0) = 42)是什么意思?
另一种方法可能是使用Google Coredumper 库。这会产生与 fork+abort 技术类似的结果,但与多线程应用程序配合得更好(在 fork 之前暂停所有线程一段时间,以免它们在子进程中造成混乱)。
例子:
#include【讨论】:
Sun 介绍了如何在 Solaris、HP-UX、Redhat 和 Windows here 上获取核心文件。
Solaris 有 gcore 程序。 HP-UX 可能有它。 否则使用 gdb 及其 gcore 命令。 Windows 有 win-dbg-root\tlist.exe 和 win-dbg-root\adplus.vbs
【讨论】:
你真的想要一个核心,还是只是一个堆栈跟踪? 如果你想要的只是一个堆栈跟踪,你可以看看开源 here 并尝试从那里集成代码,或者只是从命令行调用它就足够了。
我相信 gdb 项目中的一些代码也可能有用。
您可能想要做的另一个想法是使用 gdb 附加到正在运行的进程。
$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
【讨论】:
生成核心转储的源代码位于“gcore”中,它是 gdb 包的一部分。
另外,太阳也有gcore。
此外,您必须有一个单独的进程运行核心转储,因为当前进程必须暂停。您可以在 gcore 源代码中找到详细信息,或者您可以将您的进程作为目标运行平台的 gcore。
【讨论】: