其他
C语言段错误调试神器(core dump)
点击左上方蓝色“混说Linux”,选择“设为星标”
1
core dump 可以理解为当程序崩溃时,自动将内存信息保存到文件中。这里的 core 就是 memory,dump 就是将内存数据保存到磁盘的过程。
core dump 的一个常见原因是段错误(segmentation fault),这是由尝试访问非法内存位置引起的。这可能包括释放后使用、缓冲区溢出和写入空指针。
在bug很难复现的情况下,core dump 非常有用,它可以让你检查可能发生的情况。GDB 可用于读取 core dump 文件并分析程序崩溃原因。
core dump 设置
以 ubuntu 系统为例,Linux 提供了一个名为 ulimit 的程序来设置 core 文件大小和其他参数。
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7823
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7823
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -c unlimited
$ ulimit -c
unlimited
生成 core dump 并调试
$ gcc -ggdb -o0 <any other flags> -o file_name file_name.c
运行程序:
$ ./<file_name>
Segmentation fault (core dumped)
使用 GDB 进行定位出错位置:
$ gdb <binary-file> <core-dump-file>
GDB 有助于在程序崩溃时检查栈帧以及变量和寄存器的状态。在这种情况下,诸如 file、where、up、down、print、info locals、info args、info registers 和 list 等命令会很有帮助。
需要记住的是,在调试 core dump 时,程序实际上并没有运行,因此与程序执行相关的命令(例如 step、next 和 continue)不可用。
实例演示
// core_dump.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *ptr;
*ptr = 'x';
return 0;
}
编译运行一气呵成:
$ gcc -ggdb -o0 core_dump.c -o core_dump
$ ./core_dump
Segmentation fault (core dumped)
$ ls
core core_dump core_dump.c
这时会生成一个 core 文件:
# Load program binary and core file
$ gdb core_dump core
可以看到 GDB 定位到第8八行是引起段错误的原因。
在 gdb 中,可以使用以下命令查看 backtrace(崩溃时的函数调用栈):
bt
# or (exact same command)
where
# OR (for even more details, such as seeing all arguments to the functions--
# thanks to Peter Cordes in the comments below)
bt full
# For gdb help and details, see:
help bt
# or
help where
原文: https://www.zhihu.com/collection/724500595
往期推荐