[转]gdb结合coredump定位崩溃进程
http://blog.sina.com.cn/s/blog_54f82cc201013tk4.html
Linux环境下经常遇到某个进程挂掉而找不到原因,我们可以通过生成core file文件加上gdb来定位。
如何产生core file?
我们可以使用ulimit这条命令对core file文件的大小进行设定。
一般默认情况下,core file的大小被设置为了0,这样系统就不dump出core file了。
这时用如下命令进行设置:
ulimit -c unlimited
这样便把core
file的大小设置为了无限大,同时也可以使用数字来替代unlimited,对core
file的上限值做更精确的设定。
生成的core
file在哪里?
file在哪里?
core
file生成的地方是在/proc/sys/kernel/core_pattern文件定义的。
file生成的地方是在/proc/sys/kernel/core_pattern文件定义的。
改动到生成到自己定义的目录的方法是:
echo "pattern"
> /proc/sys/kernel/core_pattern
并且只有超级用户可以修改这两个文件。
"pattern"类似我们C语言打印字符串的格式,相关标识如下:
%%: 相当于%
%p: 相当于
%u: 相当于
%g: 相当于
%s:
相当于导致dump的信号的数字
%t: 相当于dump的时间
%h:
相当于hostname
%e:
相当于执行文件的名称
%p: 相当于
%u: 相当于
%g: 相当于
%s:
相当于导致dump的信号的数字
%t: 相当于dump的时间
%h:
相当于hostname
%e:
相当于执行文件的名称
这时用如下命令设置生成的core
file到系统/tmp目录下,并记录pid以及执行文件名
file到系统/tmp目录下,并记录pid以及执行文件名
echo "/tmp/core-%e-%p"
> /proc/sys/kernel/core_pattern
> /proc/sys/kernel/core_pattern
测试如下代码
1
2
3
4
5
6
7
8
9
10
11
12
|
#include int func( int *p)
{ *p
} int main()
{ func(NULL);
return 0;
} |
生成可执行文件并运行
gcc -o main
a.c
a.c
root@ubuntu:~# ./main
Segmentation fault (core
dumped)
Segmentation fault (core
dumped)
<-----这里出现段错误并生成core文件了。
在/tmp目录下发现文件core-main-10815
如何查看进程挂在哪里了?
我们可以用
gdb
main /tmp/core-main-10815
main /tmp/core-main-10815
查看信息,发现能定位到函数了
Program terminated with signal 11, Segmentation
fault.
#0 0x080483ba in func ()
fault.
#0 0x080483ba in func ()
如何定位到行?
在编译的时候开启-g调试开关就可以了
gcc -o
main -g a.c
main -g a.c
gdb main
/tmp/core-main-10815
最终看到的结果如下,好棒。
Program terminated with signal 11,
Segmentation fault.
#0 0x080483ba in func (p=0x0) at a.c:5
5
*p = 0;
Segmentation fault.
#0 0x080483ba in func (p=0x0) at a.c:5
5
*p = 0;
总结一下,需要定位进程挂在哪一行我们只需要4个操作,
ulimit -c
unlimited
unlimited
echo "/tmp/core-%e-%p"
> /proc/sys/kernel/core_pattern
gcc -o
main -g a.c
main -g a.c
gdb main
/tmp/core-main-10815
/tmp/core-main-10815
就可以啦。
补充说明:
相关常用gdb命令
1,(gdb)
backtrace
backtrace
以上面的例子为例
Program terminated with signal 11, Segmentation
fault.
fault.
#0
0x080483ba in func (p=0x0) at
main.c:5
0x080483ba in func (p=0x0) at
main.c:5
5
*p = 0;
*p = 0;
(gdb) backtrace
#0
0x080483ba in func (p=0x0) at
main.c:5
0x080483ba in func (p=0x0) at
main.c:5
#1
0x080483d4 in main () at
main.c:10
0x080483d4 in main () at
main.c:10
如果是多线程环境下(gdb)
thread apply all backtrace
thread apply all backtrace
2,(gdb) print
[var]
[var]
(gdb) print p
$1
= (int *) 0x0
= (int *) 0x0
(gdb) print &p
$2
= (int **) 0xbf96d4d4
= (int **) 0xbf96d4d4
3,(gdb) x/FMT
[Address]
[Address]
其中
FMT
is a repeat count followed by a format letter and a size
letter.
is a repeat count followed by a format letter and a size
letter.
Format letters are o(octal), x(hex), d(decimal),
u(unsigned decimal),
u(unsigned decimal),
t(binary), f(float),
a(address), i(instruction), c(char) and
s(string).
a(address), i(instruction), c(char) and
s(string).
Size letters are b(byte), h(halfword), w(word),
g(giant, 8 bytes).
g(giant, 8 bytes).
The
specified number of objects of the specified size are
printed
specified number of objects of the specified size are
printed
according to the format.
(gdb) x/d 0xbf96d4d4
0xbf96d4d4: 0
(gdb) x/c 0xbf96d4d4
0xbf96d4d4: 0 '\000'
另外能导致产生core
file文件的信号有以下10种
file文件的信号有以下10种
SIGQUIT:终端退出符
SIGILL:非法硬件指令
SIGTRAP:平台相关的硬件错误,现在多用在实现调试时的断点
SIGBUS:与平台相关的硬件错误,一般是内存错误
SIGABRT:调用abort函数时产生此信号,进程异常终止
SIGFPE:算术异常
SIGSEGV:segment
violation,无效内存引用
SIGXCPU:超过了cpu使用资源限制(setrlimit)
SIGXFSZ:超过了文件长度限制(setrlimit)
SIGSYS:无效的系统调用