[转]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. [Nginx 2] form表单提交,图片上传

    导读:昨晚恶补了一些Nginx服务器的东西,从整体上对Nginx有一个初步的了解.上午去找师哥问了问目前项目中的使用情况,然后就开始上传图片了.这里就简单总结整理一下今天的成果,以后接着提升.简单粗暴 ...

  2. PPTP --VPN配置

    测试:1:根据上面的步骤4,在路由器里查看状态:2:手机热点,共享给你电脑,电脑拨号,进行测试.   参考:http://jingyan.baidu.com/article/90808022ddd6a ...

  3. aspx网页相对布局

    网页的布局 <body bgcolor="#b6b7bc"> <form id="form1" runat="server" ...

  4. Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

    本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...

  5. 破解Demo

    需要破解的程序界面如下: 需要破解的程序的主要代码如下: void CEasyCrackMeDlg::OnBnClickedButtonOk() { // TODO: 在此添加控件通知处理程序代码 T ...

  6. 新手浅谈C#Task异步编程

    Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async.await,这儿我们先说Task相关. 在实际编程中,我们用的较多的是Task.Task.Fa ...

  7. JAVA之多线程的创建

    转载请注明源出处:http://www.cnblogs.com/lighten/p/5967853.html 1.概念 老调重弹,学习线程的时候总会牵扯到进程的概念,会对二者做一个区分.网上有较多的解 ...

  8. php通过正则从字符串中获取所有图片url地址

    /** * 提取字符串中图片url地址 * @param type $str * @return type */ function getimgs($str) { $reg = '/((http|ht ...

  9. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(五)-- Filter

    在上一篇里,介绍了中间件的相关内容和使用方法.本篇将介绍Asp.Net Core MVC框架的过滤器的相关内容和使用方法,并简单说明一下与中间件的区别. 第一部分.MVC框架内置过滤器 下图展示了As ...

  10. POJ C++程序设计 编程题#3 编程作业—文件操作与模板

    编程题#3: 整数的输出格式 来源: POJ(Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 1000kB 描述 利 ...