首页 > 数据库技术 > 详细

linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)

时间:2017-04-16 09:14:30      阅读:262      评论:0      收藏:0      [点我收藏+]

       addr2line有什么作用呢? 可别小瞧它, 它能够定位到代码出错的位置。

以下, 我们来看看这个简单的代码:

#include <stdio.h>

int main()
{
        int *p = NULL;
        *p = 0;

        printf("bad\n");
        return 0;
}
       这个程序非常小, 我们能够一眼就看出程序在执行期出错。 可是, 假设是大程序, 在执行期出错。 我们该怎样定位呢?  那就必须依赖于工具。 而不是你我的肉眼。


       我们以上述小程序为例, 进行例如以下操作:

[taoge@localhost learn_c]$ gcc -o taogeSeg -g taogeSeg.c 
[taoge@localhost learn_c]$ ./taogeSeg 
Segmentation fault (core dumped)
[taoge@localhost learn_c]$ dmesg | grep taogeSeg
taogeSeg[4941]: segfault at 0 ip 080483c9 sp bfb92410 error 6 in taogeSeg[8048000+1000]
[taoge@localhost learn_c]$ addr2line -e taogeSeg 080483c9
/home/taoge/Desktop/learn_c/taogeSeg.c:6
[taoge@localhost learn_c]$ cat -n taogeSeg.c
     1	#include <stdio.h>
     2	
     3	int main()
     4	{
     5		int *p = NULL;
     6		*p = 0;
     7	
     8		printf("bad\n");
     9		return 0;
    10	}
[taoge@localhost learn_c]$ 

       我来解释一下:

       1. gcc -o taogeSeg -g taogeSeg.c :生成带有调试信息的可运行文件taogeSeg
       2. dmesg | grep taogeSeg :获得运行taogeSeg后的出错信息, 你能够将结果理解为日志, 当中的080483c9是一个地址, 正是这个地址出错了
       3. addr2line -e taogeSeg 080483c9 :将出错地址转换成源码相应的行, 结果为6, 也就是说源码第6行有问题。 一看, 果然是,万恶的*p=0;被揪出来了。

       当然。 针对这个样例, 会gdb调试的朋友肯定也能调试出来,并且也确实能找到代码出错的地址和源码行, 从这个意义上来讲。 gdb内部也携带了类addr2line的功能。这是不是说gdb就能够替代addr2line呢? 不是的。

假设某bug低概率发生。 如今仅仅有一份crash log, 那就要用addr2line了, 由于你用gdb时。 该bug不一定发生啊。


    
       实际上, 在非常多linux大型软件开发中, 常常出现段错误, 造成进程挂掉, 系统崩溃等问题, 此时, 用addr2line是比較好的方法。

在后面的博文中, 我们会继续了解与addr2line有关的调试方法, 毕竟, 代码调试太重要了。事实上呢, 假设不熟悉addr2line的使用, 或者干脆没有听说过这个命令, 那最好不要说自己搞linux开发。 免得被人歧视啊。 



       OK, 本文仅仅是一个引子, 能在实战中熟练使用addr2line才见真功夫。

如能熟练掌握addr2line的使用。 以后听到什么段错误, 系统崩溃。 就没那么毛骨悚然了。


     



linux程序调试命令addr2line之入门简单介绍(本文先不聊gdb调试)

原文:http://www.cnblogs.com/zhchoutai/p/6717780.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!