C程序如何在不终止的情况下产生自身的核心转储?
时间:2020-03-06 14:42:12 来源:igfitidea点击:
我想让C程序在某些情况下产生核心转储。这是一个在生产环境中运行的程序,不容易停止和重新启动以调整其他类型的调试代码。另外,由于它是在生产环境中,所以我不想调用abort()。被调查的问题很难在非生产环境中复制。我想要的是该程序,当它检测到某些问题时,可以自行生成一个核心转储,最好提供足够的信息来重命名该文件,然后继续。
解决方案
产生核心转储的源代码在" gcore"中,它是gdb软件包的一部分。
另外,太阳有gcore。
另外,我们必须有一个单独的进程运行核心转储,因为必须暂停当前进程。我们可以在gcore源代码中找到详细信息,也可以仅以进程为目标运行平台的gcore。
Sun在此处介绍了如何在Solaris,HP-UX,Redhat和Windows上获取核心文件。
Solaris具有gcore程序。 HP-UX可能有它。
否则,请使用gdb及其gcore指令。
Windows具有win-dbg-root \ tlist.exe和win-dbg-root \ adplus.vbs
我们是否真的想要一个内核,或者只是一个stacktrace?
如果我们想要的只是stacktrace,我们可以在这里查看开源并尝试从那里集成代码,或者仅从命令行调用就可以了。
我相信gdb项目中的一些代码也可能有用。
我们可能想要做的另一种想法是使用gdb添加到正在运行的进程。
$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
void create_dump(void) { if(!fork()) { // Crash the app in your favorite way here abort() || (*((void*)0) = 42); } }
分叉该过程然后使孩子崩溃,它会在我们需要时给我们快照