工具集binutils

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012142460/article/details/84672381

该文章主要参考大牛李云的博客http://blog.51cto.com/yunli/186727,自己写一写更有助于加深记忆

1、addr2line,用程序地址得到对应的函数和行号。

这个一般用在错误分析的时候,根据backtrace显示的代码地址,得到出错的行号和函数。

一个简单的实例:

#include <stdio.h>
void go()
{
         printf("the go func addr is 0x%x\n",go);
}
int main()
{
         go();
         return 0;
}

执行的结果为

通过命令:addr2line 0x40052d -f -e main

尴尬,我的行号显示乱码,不知道为何,欢迎大神解答

2 nm

 nm是names的缩写,用于列出程序文件中的符号

命令格式:nm [option(s)] [file(s)]

常用option

  • -A 在每个符号信息的前面打印所在对象文件名称;
  • -C 输出demangle过了的符号名称;
  • -D 打印动态符号;
  • -l 使用对象文件中的调试信息打印出所在源文件及行号;
  • -n 按照地址/符号值来排序;
  • -u 打印出那些未定义的符号;

我们来看一下上面main文件使用nm指令后的结果

第一列是地址,第二列是符号存放的位置,第三列是符号的名称

我们看go函数的地址与我们打印出来的地址是一致的。第二列的具体含义如下

3 objdump

objdump可以用来查看目标程序中的段信息和调试信息,也可以用来对目标程序进行反汇编。

常用的几个命令

objdump -h 查看程序的段信息

段的名称,段大小,VMA地址,LMA地址,File off,对齐方式。

VMA是这个段的运行地址,LMA是这个段LOAD地址,这两个地址一般是一致的,但也有可能是不一致,这与链接脚本的设置有关系。

objdump -f 显示目标文件的头信息

objdump -S   

输出C源代码和反汇编出来的指令对照的格式,这个在代码调试的时候是很有用的,可以根据backtrace的信息寻找代码crash的地点

猜你喜欢

转载自blog.csdn.net/u012142460/article/details/84672381