Gdb+core调试技术

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

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

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

1. 系统设置

使用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:~>

2. 编译程序

当然另外一个就是要是用gdb来调试程序,那编译的时候加入-g参数就是必不可少的,

下面是我在调试一个线程程序时的情况:


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>

3. 使用gdb+core调试:


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

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



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退出

One thought on “Gdb+core调试技术

Leave a Reply

Your email address will not be published. Required fields are marked *