linux core 分析,linux 下调试 core dump 方式汇总,工作必备技能

本文详细介绍了在Linux环境下如何利用coredump进行程序调试,包括使用dmesg、addr2line、gdb和strace等工具。通过实例展示了如何找到并解析错误代码行,帮助开发者定位和解决程序异常问题。
摘要由CSDN通过智能技术生成

原标题:linux 下调试 core dump 方式汇总,工作必备技能

缘起

调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。

从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志,这会让你不知所措。

今天给大家介绍一个 core 文件,用这个文件,我们可以找出对应 出错的代码行,感觉是不是很神奇。

透着树荫看着朦胧的太阳,晒着日光浴,感觉还不错。先学完这篇,我们再去欣赏风景。

什么是core dump

对于程序,由于各种异常或者 bug,导致在运行过程中,并且在满足一定条件下,产生一个叫做 core 的文件。

通常情况下,core 文件会包含了,程序运行时的 内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等。

许多程序出错的时候,会产生一个 core 文件。通过工具分析这个文件,我们可以定位到,程序异常退出的时候对应的堆栈调用等信息。

打开 core dump 开关: ulimit -c unlimited

看一段有问题的代码:

#include

int main

{

int*p=NULL;

*p= 0;

printf( "badn");

return0;

}

linux下编译和执行:

[root @VM- 16- 9-centos c++]# g++ -g main.cpp

[root @VM- 16- 9-centos c++]# ./a. out

Segmentation fault (core dumped)

[root@VM-16-9-centos c++]# ls

a.out core.1989 main.cpp

上述代码一看就有错误,执行会产生 core dump。但是在大型项目中,用肉眼就很难看了。下面说明一下 linux 下调试 core dump 方法。

dmesg+addr2line调试

先介绍 2 个 linux 命令:

dmesg ,一种程序,用于 检测和控制内核缓冲。程序用来帮助用户,了解系统的启动信息,可以获得出错堆栈地址。

addr2line ,可以将指令的地址和可执行映像转换成文件名,函数名或源代码的工具。这种功能将跟 踪地址转换成更有意义的内容来说很有用。

在调用 addr2line 工具时,要使用 -e 选项来指定 可执行映像,使用 -f 选项可以告诉工具输出函数名。

linux下操作过程:

[root @VM- 16- 9-centos c++]# dmesg | grep a.out

[ 212.330289] a.out[ 1946]: segfault at 0ip 0000000000400571sp 00007ffdf0aafbb0 error 6in a.out[ 400000+ 1000]

[ 227.437065] a.out[ 1989]: segfault at 0ip 0000000000400571sp 00007ffcfd01c8c0 error 6in a.out[ 400000+ 1000]

[root @VM- 16- 9-centos c++]#

[root @VM- 16- 9-centos c++]# addr2line -e a.out 0000000000400571

/root/c++/main.cpp: 6

先通过dmesg找到对应出错的地址,再用 addr2line-e将地址解析到对应的代码行。

gdb调试

gdb 想必大家都有听说,Linux 下面一款常用的的调试工具。

gdb 编译器通常以 gdb 命令的形式在终端中使用,下面学习下常用调试选项。

bt :查看堆栈信息

i locals :查看当前程序栈的局部变量

i args :查看当前程序栈的参数

i catch :查看当前程序中栈帧的异常处理器

p a :打印变量的值

i register :查看当前寄存器的值

r :从运行程序至第一个断点,没有断点则一直运行完

quit :退出

gdb调试过程中,输入 r ,bt。r 是运行 a.out 文件,bt查看堆栈情况。

我们不需要执行 gdb a.out,这样就相当于重新运行了 a.out 文件。然而在实际开发中,有很多问题都是 概率发生的,所以此方法不太实用。

linux下操作过程(省略部分 gdb 介绍信息):

[root @VM- 16- 9-centos c++]# gdb a.out core .1989

Reading symbols from /root/c++/a.out...done.

[New LWP 1989]

bCore was generated by `./a.out '.

Program terminated with signal 11, Segmentation fault.

#0 0x0000000000400571 in main at main.cpp:6

6 *p=0;

Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64

(gdb) bt

#0 0x0000000000400571 in main at main.cpp:6

(gdb)

直接执行 gdb a.out core.1989,不用 r 命令避免程序重复执行。 使用 bt 命令,可以看到程序出错代码行。

strace+addr2line调试

strace 是一个集诊断、调试、统计与一体的工具,我们可以使用strace,对应用的系统调用和信号传递的跟踪结果,来对应用进行分析,以达到解决问题,或者是了解应用工作过程的目的。

strace 的简单的用法就是,执行一个指定的命令,在指定的命令结束之后,它也就退出了。

在命令执行的过程中, strace 会记录和解析命令进程的所有系统调用,以及这个进程所接收到的,所有的信号值。

-c ,统计每一系统调用的所执行的时间,次数和出错的次数等

-p ,指定进程pid

-i ,输出系统调用的入口指针

linux 下操作过程(省略部分加载信息):

[root @VM- 16- 9-centos c++]# strace -i ./a.out

[ 00007f79d3573847] munmap( 0x7f79d3772000, 31038) = 0

[ 0000000000400571] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---

[????????????????] +++ killed by SIGSEGV (core dumped) +++

Segmentation fault

[root@VM-16-9-centos c++]# addr2line -e a.out 0000000000400571

/root/c++/main.cpp:6

絮叨

linux 调试技巧很重要,平时用到的也会很多,掌握好这些很关键。通过这篇文章,希望读者能对 core dump 调试有大致了解。

1、 这种古法制作CPU,看第一眼就被震撼到了

2、 这些 Linux 的 “自动化” 技巧,教你轻松完成任务

3、 这5种常用运维监控工具都不会用,还算什么运维人?返回搜狐,查看更多

责任编辑:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值