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调试)的更多相关文章

  1. CocoaPods常用终端命令及Profile文件简单介绍

    Pod常用终端命令 pod init 创建pod文件 pod install 开始安装第三方框架,如果网上有更新,会安装最新的 pod install --verbose--no-repo-updat ...

  2. Linux常用命令及Shell的简单介绍

    一.linux命令   1.查看指令的参数搭配: man 指令名称   2.基础指令 ls  列出当前目录下的所有文档的名称(文档指的是文件和文件夹) 常用参数搭配: ls -l 列出文档详细信息 l ...

  3. Linux下chkconfig命令详解 这个简单明了啊

    chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息.谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接. 使用语法:chkconfig [--ad ...

  4. MongoDB入门简单介绍

    有关于MongoDB的资料如今较少,且大多为英文站点,以上内容大多由笔者翻译自官网,请翻译或理解错误之处请指证.之后笔者会继续关注MongoDB,并翻译“Developer Zone”和“Admin ...

  5. 史上最简单的Hibernate入门简单介绍

    事实上Hibernate本身是个独立的框架,它不须要不论什么web server或application server的支持.然而,大多数的Hibernate入门介绍都加入了非常多非Hibernate ...

  6. C#的winform编程入门简单介绍

    C#中事件.事件委托.事件的订阅 例子: using System.Timers; Timer t1 = new Timer(); t1.Tick += new EventHandler(XX); p ...

  7. 八、mini2440裸机程序之UART(1)简单介绍【转】

    转自:http://blog.csdn.net/shengnan_wu/article/details/8298869 一.概述          S3C2440通用异步接收和发送(UART)提供了三 ...

  8. 构建基于Javascript的移动web CMS入门——简单介绍

    看到项目上的移动框架,网上寻找了一下,发现原来这些一開始都有. 于是,找了个演示样例開始构建一个移动平台的CMS--墨颀 CMS,方便项目深入理解的同一时候.也能够自己维护一个CMS系统. 构建框架 ...

  9. 详解linux中install命令和cp命令的区别

    基本上,在Makefile里会用到install,其他地方会用cp命令. 它们完成同样的任务——拷贝文件,它们之间的区别主要如下: .最重要的一点,如果目标文件存在,cp会先清空文件后往里写入新文件, ...

随机推荐

  1. H5 video标签视频加载存在的问题

    客户发现上传的视频无法播放,然后主管让我解决这个问题,这个页面不是我负责的,我看了代码,发现视频用的h5标签video标签加载视频.我看了没问题,然后 我先用ie浏览器打开,视频加载没问题.然后我给主 ...

  2. 解决mongo 端口占用问题

    在打开mongod之后如果不用了就按ctrl + c ,就不会出现以下的问题了 执行mongod报错 mongod 2016-08-03T14:31:15.691+0800 I CONTROL [in ...

  3. [ 转载 ]学习笔记-svn用法详解

    SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上 ...

  4. luogu4770 [NOI2018]你的名字 后缀自动机 + 线段树合并

    其实很水的一道题吧.... 题意是:每次给定一个串\(T\)以及\(l, r\),询问有多少个字符串\(s\)满足,\(s\)是\(T\)的子串,但不是\(S[l .. r]\)的子串 统计\(T\) ...

  5. [WC2018]州区划分(状压DP+FWT/FMT)

    很裸的子集反演模板题,套上一些莫名其妙的外衣. 先预处理每个集合是否合法,再作显然的状压DP.然后发现可以写成子集反演的形式,直接套模板即可. 子集反演可以看这里. 子集反演的过程就是多设一维代表集合 ...

  6. ZeptoLab Code Rush 2015 B. Om Nom and Dark Park DFS

    B. Om Nom and Dark Park Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/5 ...

  7. poj 1328 Radar Installation 排序贪心

    Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 56702   Accepted: 12 ...

  8. centos7 docker安装和使用_入门教程

    说明:本文也是参考互联网上的文章写的,感谢相关作者的贡献. 操作系统 64位CentOS Linux release 7.2.1511 (Core) 配置好IP:192.168.1.160 修改yum ...

  9. Git_Bug分支

    软件开发中,bug就像家常便饭一样.有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除. 当你接到一个修复一 ...

  10. 用zrender实现工作流图形化设计(附范例代码)

    公司研发的管理系统有工作流图形化设计和查看功能,这个功能的开发历史比较久远.在那个暗无天日的年月里,IE几乎一统江湖,所以顺理成章地采用了当时红极一时的VML技术. 后来的事情大家都知道了,IE开始走 ...