GDB生成核心文件

6

好的,不要问我为什么,我想创建一个测试程序的核心文件。它没有损坏,也不会出问题,但我想生成一个核心文件。以下是代码:

#include <stdio.h>
int main(){
printf("TEST");
}

正如我所说的那样,这非常简单,但我想能够转储它的核心。我该怎么做呢? 顺便说一句,我在Ubuntu 10.04上。


你想通过更改程序本身还是外部来实现这个? - CB Bailey
你想改变程序以生成核心转储,还是保持程序不变并在外部触发核心转储? - CB Bailey
我想要在外部触发核心转储。 - Jack Jacobsen
1
你可以使用 kill -SEGV <pid> 命令来模拟一个段错误。 - mvds
@Jack Jacobsen:可能已经不存在了。你的程序将会快速退出。 - CB Bailey
显示剩余2条评论
4个回答

12

在加载了可执行文件的gdb命令提示符下,使用generate-core-file命令。


+1,但应注意在Windows上不支持此功能(至少没有Cygwin的情况下)。 - Michael Burr
唉...在OpenBSD上使用GCC 6.6:*未定义命令:"generate-core-file"。请尝试"help"* - jww

6

如果您可以更改程序并添加对abort()的调用,将在许多Unix环境中生成核心转储。

您需要确保已启用核心文件。未生成核心文件的最常见原因是零大小的核心 ulimit 。使用命令 ulimit -c 检查并使用 ulimit -c unlimited 重置为零。

如果您不想更改程序,则可以使用kill命令发送abort信号: kill -SIGABRT <pid> 但是对于如此短的程序,您可能需要使用脚本,即使使用脚本,您也可能无法在进程退出之前获得信号。

使用bash,您可以尝试像这样做(假设您的程序名为a.out并且在当前目录中):

./a.out & kill -SIGABRT $!

& 表示在后台运行命令,$! 是最近执行的后台命令的进程 ID。


应用程序在发送SIGABRT信号之前退出,这是否可能?您需要使用sleep()或scanf()等待。 - Raphael Bossek
@Raphael B.:是的,这正是我所说的:“即使这样,您可能仍无法在进程退出之前获取信号。” 我不确定我理解您的(-1)解释? - CB Bailey

6

将您的程序加载到gdb中,设置断点,运行到断点,然后

(gdb) generate-core-file


唉...在OpenBSD上使用GCC 6.6:*未定义命令:"generate-core-file"。请尝试"help"* - jww

0
另一个选择是使用gcore命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接