博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
gdb结合coredump定位崩溃进程
阅读量:2435 次
发布时间:2019-05-10

本文共 2772 字,大约阅读时间需要 9 分钟。

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在哪里?
core file生成的地方是在/proc/sys/kernel/core_pattern文件定义的。
改动到生成到自己定义的目录的方法是:
echo "pattern" > /proc/sys/kernel/core_pattern
并且只有超级用户可以修改这两个文件。
"pattern"类似我们C语言打印字符串的格式,相关标识如下:
%%: 相当于%
%p: 相当于<pid>
%u: 相当于<uid>
%g: 相当于<gid>
%s: 相当于导致dump的信号的数字
%t: 相当于dump的时间
%h: 相当于hostname
%e: 相当于执行文件的名称
这时用如下命令设置生成的core file到系统/tmp目录下,并记录pid以及执行文件名
echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern
 
测试如下代码
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int
func(
int
*p)
{
        
*p = 0;
}
 
int
main()
{
        
func(NULL);
        
return
0;
}
 
生成可执行文件并运行
gcc -o main a.c
root@ubuntu:~# ./main
Segmentation fault (core dumped) 
<-----这里出现段错误并生成core文件了。
在/tmp目录下发现文件core-main-10815 
 
如何查看进程挂在哪里了?
我们可以用
gdb main /tmp/core-main-10815 
查看信息,发现能定位到函数了
Program terminated with signal 11, Segmentation fault.
#0  0x080483ba in func ()
 

如何定位到行?

在编译的时候开启-g调试开关就可以了
gcc -o 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;
 
总结一下,需要定位进程挂在哪一行我们只需要4个操作,
ulimit -c unlimited
echo "/tmp/core-%e-%p" > /proc/sys/kernel/core_pattern
gcc -o main -g a.c
执行程序
gdb main /tmp/core-main-10815 
就可以啦。
 
补充说明:
相关常用gdb命令
1,(gdb) backtrace /* 查看当前线程函数栈回溯 */
以上面的例子为例
Program terminated with signal 11, Segmentation fault.
#0  0x080483ba in func (p=0x0) at main.c:5
5*p = 0;
(gdb) backtrace
#0  0x080483ba in func (p=0x0) at main.c:5
#1  0x080483d4 in main () at main.c:10
如果是多线程环境下(gdb) thread apply all backtrace /* 显示所有线程栈回溯 */
 
2,(gdb) print [var] /* 查看变量值 */
(gdb) print p
$1 = (int *) 0x0
(gdb) print &p
$2 = (int **) 0xbf96d4d4
 
3,(gdb) x/FMT [Address] /* 根据格式查看地址指向的值 */
其中
FMT 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),
  t(binary), f(float), a(address), i(instruction), c(char) and s(string).
Size letters are b(byte), h(halfword), w(word), g(giant, 8 bytes).
The 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种

SIGQUIT:终端退出符

SIGILL:非法硬件指令

SIGTRAP:平台相关的硬件错误,现在多用在实现调试时的断点

SIGBUS:与平台相关的硬件错误,一般是内存错误

SIGABRT:调用abort函数时产生此信号,进程异常终止

SIGFPE:算术异常

SIGSEGV:segment violation,无效内存引用

SIGXCPU:超过了cpu使用资源限制(setrlimit)

SIGXFSZ:超过了文件长度限制(setrlimit)

SIGSYS:无效的系统调用

使用GDB可能会提示错误:

第二次安装总结:1、需要先修改“/etc/yum.repos.d/CentOS-Debuginfo.repo”文件的enable=1;2、使用 sudo yum install glibc 安装;3、使用 debuginfo-install glibc-2.12-1.166.el6_7.7.x86_64安装。测试,安装成功。

转载地址:http://zygmb.baihongyu.com/

你可能感兴趣的文章
想起一句话:”多加一层,就可以把问题解决了“
查看>>
PostgreSQL Page页结构解析(7)- B-Tree索引存储结构#3
查看>>
企业文化和价值观
查看>>
推荐书籍:金字塔原理
查看>>
基础存储知识
查看>>
PostgreSQL 源码解读(37)- 查询语句#22(查询优化-grouping_plan...
查看>>
PostgreSQL 源码解读(44)- 查询语句#29(等价类相关数据结构)
查看>>
PostgreSQL 源码解读(48)- 查询语句#33(query_planner函数#9)
查看>>
PostgreSQL 源码解读(45)- 查询语句#30(query_planner函数#6)
查看>>
PostgreSQL 源码解读(47)- 查询语句#32(query_planner函数#8)
查看>>
PostgreSQL 源码解读(17)- 查询语句#2(查询优化基础)
查看>>
Windows Vista内置趣味实用工具大搜罗(转)
查看>>
FreeBSD安装文件系统(转)
查看>>
最简单FreeBSD网关方案(转)
查看>>
Windows 98 多用户的管理(转)
查看>>
更改Windows XP 的日期和时间(转)
查看>>
windows2000中的“秘密武器”(三)(转)
查看>>
Linux程序应用开发环境和工具经验谈(转)
查看>>
Linux办公一条龙之电子表格Calc(转)
查看>>
在NETBSD上配置ADSL+IPF+IPNAT(转)
查看>>