在Linux系统中,我们可以通过C程序或sleep
命令来生成core dump。
- 使用C程序生成core dump:我们可以编写一个简单的C程序,使其发生段错误(segmentation fault),从而生成core dump。这通常涉及到尝试访问一个空指针或未分配的内存。编译并运行这个程序后,它会崩溃并生成一个core dump。
- 使用
sleep
命令生成core dump :我们可以启动一个sleep
进程,并使用kill
命令向其发送SIGSEGV
信号。这将导致进程崩溃并生成core dump。这种方法的优点是不需要编写任何代码,但可能不适用于所有进程,因为一些进程可能有机制来捕获和处理SIGSEGV
信号。
在生成core dump之前,需要确保系统已经启用了core dump。这通常可以通过ulimit -c unlimited
命令来实现。下面详细的来介绍一下这两种方法。
使用C 程序生成Core dump
要在 Linux 中测试core dump功能,你可以创建一个会崩溃的简单程序,然后检查是否生成了core dump文件。以下是一个使用 C 语言的例子:
- 创建一个会导致段错误(segmentation fault)的简单 C 程序。例如:
#include <stdio.h>
int main() {
int *ptr = NULL;
printf("%d\n", *ptr);
return 0;
}
将此代码保存在名为 crash.c
的文件中。
- 编译程序:
gcc -g -o crash crash.c
-g
选项包含调试信息,这在分析核core dump时会很有用。
- 启用core dump:
ulimit -c unlimited
此命令将创建的核心文件的最大大小设置为无限制。默认情况下,可能禁用了core dump,此命令将启用它们。
- 运行程序:
./crash
这将导致段错误并创建core dump。core dump文件的名称将取决于你的核心模式。
- 你现在应该在当前目录中有一个core dump文件。你可以使用以下命令进行检查:
ls core*
这将列出所有以 core
开头的文件。
- 现在,你可以使用像
gdb
这样的调试器来分析core dump:
gdb ./crash core
将 core
替换为你的core dump文件的实际名称。这将启动 gdb
并加core dump储。从这里开始,你可以使用各种 gdb
命令来分析core dump。
使用sleep来生成core dump
在 linux中生成core dump,你可以使用 kill
命令向正在运行的进程发送 SIGSEGV
信号。如果启用了core dump,此信号将导致进程崩溃并生成core dump。
以下是一个简单的例子:
首先,启动一个在后台运行的进程。例如,你可以启动一个 sleep
进程: 这将启动一个在后台运行 10000 秒的 sleep
进程。
sleep 10000 &
找到进程的进程 ID (PID)。你可以使用 ps
命令来做这个:
ps -e | grep sleep
这将输出一行类似于以下的内容:
12345 pts/0 00:00:00 sleep
在这个例子中,PID 是 12345。
向进程发送 SIGSEGV
信号: 将 12345 替换为你的进程的实际 PID。
kill -SIGSEGV 12345
这将导致进程崩溃并生成core dump。
请注意,这只是一个简单的例子,可能不适用于所有进程。一些进程有捕获和处理 SIGSEGV
信号的机制,当它们收到此信号时,可能不会崩溃或生成core dump。