Gdb+core调试技术

| 2010年9月15日

做c方面的开发,免不了要是用gdb来调试程序,最近也是在公司做的时候时常需要使用gdb来分析程序,使用最多的当属使用core来查看程序运行的crash原因。

在linux中应用程序运行奔溃之后一般会产生core文件,core文件是core dump来产生,core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中。

要生成core dump文件,首先要在系统中设置core文件大小的上限,超过这个上限的core文件就不生成了,而一般系统的设置是0,即不生成core文件,所以要先修改这个上限值,设置如下:

系统设置

使用ulimit -a命令查看系统所有限制情况,

helight@zhwen:~> ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 3583
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3583
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
helight@zhwen:~>

使用ulimit -c ***来设置core文件大小的上限。一般使用ulimit -c unlimited即不限制core文件大小。

helight@zhwen:~> ulimit -c unlimited
helight@zhwen:~> ulimit -a
core file size          (blocks, -c) unlimited
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 3583
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 3583
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
helight@zhwen:~>

编译程序

当然另外一个就是要是用来调试程序,那编译的时候加入参数就是必不可少的,下面是我在调试一个线程程序时的情况:

helight@zhwen:~/test> g++ -g test.cpp -o test -lpthread
helight@zhwen:~/test> ./test
This is the main process.
This is the main process.
This is the main process.
This is a pthread.
This is a pthread.
This is a pthread.
Segmentation fault (core dumped)
helight@zhwen:~/test> ls
core.314  test  test.cpp
helight@zhwen:~/test>

使用调试:

helight@zhwen:~/test> gdb ./test ./core.314
GNU gdb (GDB) SUSE (6.8.50.20090302-1.5.18)
....

启动调试可以使用where或者bt(breaktrace)来查看错误发生的位置和堆栈。

...
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0  0x080486bd in xthread (args=0x0) at test.cpp:17
17              printf("yyyyyyyyy%ld \n",*xy);
(gdb) bt
#0  0x080486bd in xthread (args=0x0) at test.cpp:17
#1  0xb7ee535b in start_thread () from /lib/libpthread.so.0
#2  0xb7d5dc0e in clone () from /lib/libc.so.6
(gdb)

在gdb的调试中还可以使用一下的一些命令来辅助调试:

search fun_name 查找函数

b fun_name在这个函数处设置断点

b file.c 114 在file.c这个文件的114行设置断点

info break或者info b来查看当前设置断点的情况

run 运行程序

file 加载二进制文件

n执行下一语句

s单步执行

c继续运行

p name 打印变量

q退出

看完本文有收获?请分享给更多人

关注「黑光技术」,关注大数据+微服务