[转]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在哪里?
core
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:
相当于执行文件的名称
这时用如下命令设置生成的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
 
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结合coredump定位崩溃进程的更多相关文章

  1. gdb调试coredump(使用篇)

    gdb调试coredump(使用篇) 看到一个非常好的介绍coredump的文章,做个记录, 参考链接: https://blog.csdn.net/sunxiaopengsun/article/de ...

  2. 使用GDB生成coredump文件【转载】

    本文转载自: http://blog.csdn.net/sky_qing/article/details/8548989 如果在测试过程中遇到某个进程的CPU利用率过高或者卡死而需要去调试该进程时,可 ...

  3. gdb 调试coredump文件过程

    gdb 调试coredump文件过程: 第一步:首先需要一个进程的coredump文件,怎么搞出coredump文件呢? 1. ps -fax|grep                 进程名称 找到 ...

  4. gdb调试coredump文件

    linux上程序崩溃起来挺烦人,不过linux 比较好的是有gdb. 1.生成coredump文件 echo "ulimit -c unlimited" >> /etc ...

  5. linux下gdb如何处理coredump错误

    linux下gdb如何处理coredump错误 在编写C++程序中,我们经常会遇到一种错误,segment fault, 这种coredump错误 会导致程序运行时异常退出或者终止,这种错误没有明显错 ...

  6. gdb/valgrind/coredump to debug c/cpp program

    gdb/valgrind/coredump 调试 1.gdb 调试 while/for 循环 ①如果在调试 while/for的时候,可以用until xxx(其中,xxx代表 行号)直接跳转到循环后 ...

  7. VS2008通过 map 和 cod 文件定位崩溃代码行

    VS 2005/2008使用map文件查找程序崩溃原因 一般程序崩溃可以通过debug,找到程序在那一行代码崩溃了,最近编一个多线程的程序,都不知道在那发生错误,多线程并发,又不好单行调试,终于找到一 ...

  8. Linux下利用coredump技术追查进程崩溃原因

    原文链接:https://blog.csdn.net/u014585564/article/details/68063269 最近项目中出现了一个问题,服务器端程序会突然崩溃退出,我们采取了cored ...

  9. 嵌入式arm-linux mips-linux 交叉编译GDB,结合vscode图形化调试使用,coredump定位段错误

    第一部分:使用GDB GDB源码下载路径:http://ftp.gnu.org/gnu/gdb/ 遇到的主要难点: 选择合适的GDB源码版本 我的mips-linux交叉编译器不支持C++11特性,所 ...

随机推荐

  1. uinavigation样式

    UINavigationController* pNav = [[UINavigationController alloc] initWithRootViewController:pView]; [p ...

  2. JavaScript设计模式

    -->面向对象中的23种设计模式简介 最近看了一本书,推荐给大家<JavaScript设计模式与开发实践>图灵出版社的,讲的非常棒! 详细讲解了js开发中常用的14种设计模式,有很多 ...

  3. 【MySQL】MySQL回滚工具

    1.mysqlbinlog把事务从binlog中导出 2.从导出的binlog中找到要回滚的事务,去掉第一个DML语句前和最后一个DML语句后与DML无关的binlog信息 3.在目录中新建一个tab ...

  4. Android IOS WebRTC 音视频开发总结(三四)-- windows.20150706

    最近好不容易更新了PC版的WEBRTC,总结下有哪些调整,文章来自博客园RTC.Blacker,支持原创,转载请说明出处. 图1:解决方案工程结构对比: 说明: 1, 最大的调整就是移除了VideoE ...

  5. systemctl

      旧指令 新指令 使某服务自动启动 chkconfig --level 3 httpd on systemctl enable httpd.service 使某服务不自动启动 chkconfig - ...

  6. Highcharts 连续的堆积面积图

    说明:设置两个柱形图间距为0 Highcharts柱图,设置X轴各Column的间距 plotOption : {    column : {        // 设置每个柱自身的宽度        ...

  7. 面向初学者的 Windows 10 UWP 应用开发

    眼看 Windows 10 for Mobile 正式版也快要推送了,就先挖个坑吧,原文视频链接为:Windows 10 development for absolute beginners,以下博客 ...

  8. jLink V8调试exynos 4412 u-boot的几点补充

    /** ****************************************************************************** * @author    Maox ...

  9. Dynamic Prompt Table for Record Field on PeopleSoft Page

    Sometimes a situation in project work arises to have a dynamic prompt table for record fields on Peo ...

  10. PHP数组操作大全

    <?php /** * File: phpstudy : array_test.php * Created by PhpStorm. * User: IhMfLy Pheonix@jtv-070 ...