本帖最后由 顾福源 于 2018-7-4 23:20 编辑
Linux环境下,程序崩溃后可以通过分析core文件来定位问题,一般形式为 gdb file file.core;
使用core文件分析的前提是程序崩溃后系统已经成功的将core记录下来了,但是在某些情况下程序崩溃了我们并没有得到有效的core文件(如系统没有使能coredump,或系统空间不够无法保存core文件),这时开发者就不能再使用gdb+core的方式来分析问题了;
没有core文件的情况下,开发者可以考虑使用命令"addr2line"来分析问题,以以下例子说明使用方法。
假abc.c中代码如下:
[C] syntaxhighlighter_viewsource syntaxhighlighter_copycode #include <stdio.h>
int fun(int a[])
{
a[0] = 1;
}
int main()
{
fun(NULL);
return 0;
}
将abc.c编译: gcc -g abc.c -o abc (使用-g参数生成调试信息)
编译之后得到了名为"abc"的可执行文件,我们执行他则必定会出现段错误。下面我们使用addr2line命令来进行定位:
输入 addr2line -e abc 080483e1,屏幕打印如下信息:
/dev/shm/abc.c:5
从屏幕打印的信息我们则可以知道,出现问题的地方在abc.c文件中的第5行,至此我们就找到了程序出错的地方。
此时,疑问就来了,"addr2line -e abc 080483e1"中的"080483e1"是怎么来的?"080483e1"这个值并不是凭空产生的,这个是通过查看系统信息得到的,我们可以通过命令"dmesg"将系统信息打印出来,或直接查看/var/log/dmesg;
在输入"dmesg"命令后,从打印的信息中(如上图)我找到了abc出现段错误时系统记录下来的信息,"080483e1"即为ip之后的值。
关于addr2line:
addr2line如何找到的这一行呢。在可执行程序中都包含有调试信息,其中很重要的一份数据就是程序源程序的行号和编译后的机器代码之间的对应关系Line Number Table,addr2line实现了将机器代码上述内容之间的翻译。 |