Chinaunix首页 | 论坛 | 博客
  • 博客访问: 829460
  • 博文数量: 125
  • 博客积分: 4066
  • 博客等级: 上校
  • 技术积分: 1401
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-03 18:58
文章分类

全部博文(125)

文章存档

2014年(1)

2013年(1)

2012年(2)

2011年(29)

2010年(92)

我的朋友

分类: WINDOWS

2011-08-01 14:33:27

Backtrace中,一般都只有一些地址。但是利用addr2line这个工具,就可以找到对应的代码行。前提条件是可执行程序或者动态链接库编译的时候带-g选项。

具体来说,分两种情况:

  1. 如果关注的一行backtrace位于一个可执行文件中,那么直接addr2line -e
  2. 如果关注的backtrace位于一个动态链接库中,那么麻烦一些,因为动态链接库的基地址不是固定的。这个时候,首先要把进程的memory map找来。在Linux下,进程的memory map可以在/proc//maps文件中得到。然后在这个文件中找到动态链接库的基地址,然后将backtrace中的地址 - 动态链接库的基地址,得到偏移地址offset address, 最后addr2line -e

当然,用GDB也可以找出地址对应的代码行。不过相比addr2lineGDB需要将BUG现象重现一遍,所以对于不好重现的BUG,或是随机重 现的BUG来说,使用addr2line就可以直接从backtrace找到对应的代码行,不需要重现现象,比GDB使用起来更简单。

阅读(2341) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~