【问题标题】:GDB creating a core fileGDB 创建核心文件
【发布时间】:2011-01-05 22:50:04
【问题描述】:

好吧,所以不要问为什么,但我想创建一个我制作的测试程序的核心文件。它没有损坏,也没有搞砸,但我想生成它的核心文件。代码如下:

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

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

【问题讨论】:

  • 是否要通过更改程序本身或外部来执行此操作?
  • 您要更改程序以生成核心转储,还是要保持程序不变并从外部触发核心转储?
  • 我想从外部触发核心转储。
  • 您可以kill -SEGV &lt;pid&gt; 模拟分段错误。

标签: c gdb core


【解决方案1】:

从加载了可执行文件的 gdb 命令提示符发出generate-core-file 命令。

【讨论】:

  • +1,但应注意,无论出于何种原因,Windows(至少没有 Cygwin)都不支持此功能。
  • 呃... OpenBSD 上的 GCC 6.6:Undefined command: "generate-core-file". Try "help".
【解决方案2】:

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

(gdb) 生成核心文件

【讨论】:

  • 呃... OpenBSD 上的 GCC 6.6:Undefined command: "generate-core-file". Try "help".
【解决方案3】:

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

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

如果您不想更改程序,您可以使用 kill 命令发送中止信号:kill -SIGABRT &lt;pid&gt; 但对于这么短的程序,您可能不得不使用脚本,即使那样您也可能不会能够在进程退出之前获得信号。

使用 bash 你可以尝试这样的事情(假设你的程序被称为a.out 并且在当前目录中):

./a.out & kill -SIGABRT $!

&amp; 表示在后台运行,$! 是最近执行的后台命令的 PID。

【讨论】:

  • (-1) 应用程序是否有可能在发送 SIGABRT 信号之前退出?你需要一个 sleep() 或 scanf() 来等待。
  • @Raphael B.:是的,这就是我所说的:“即使那样,您也可能无法在进程退出之前获得信号”。我不确定我是否理解您的 (-1) 解释?
【解决方案4】:

另一个选项是使用 -gcore 命令。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多