addr2line
将代码地址转换为对应程序行号 常用于分析和定位内存访问错误问题
- 使用方法
- 开启core dump选项
ulimit -c unlimited - 运行程序,并生成崩溃时的core文件
执行导致程序崩溃的测试用例 - 读取core文件,获取IP寄存器的值(0x08048000)
dmesg core
在输出内容的最后一行内寻找ip寄存器值 - 使用addr2line定位代码行
addr2line 0x08048000 -f -e test.out
可执行程序必须携带有调试信息
strip
剔除可执行程序中的调试信息
先用调试版程序调试,发布时通过strip去掉调试信息,不用重新编译
ar
将目标文件打包为静态库
- 打包 ar crs libname.a x.o y.o
- 解压 ar x libname.a
nm
列出目标文件中的符号(变量名、函数名)及对应地址
输出结果由三部分组成(地址、段、标识符)
08048430(地址) T(标识符所在代码段) func(标识符名)
- 段说明
段 | 说明 |
---|---|
A | 地址值在链接过程中不会发生改变 |
B或b | 标识符位于未初始化数据段(.bss) |
C | 未定义存储段的标识符,链接时决定段位置 |
D或d | 标识符位于数据段(.data) |
N | 调试专用标识符 |
R或r | 标识符位于只读存储区(.rdata) |
T或t | 标识符位于代码段(.text) |
U | 未定义的标识符 |
objdump
查看程序段信息及反汇编
- objdump -d func.o 输出目标文件对应的汇编代码
- objdump -S func.o 输出源代码和反汇编指令对照格式
- objdump -h func.o 查看目标文件中的详细段信息
objdump -h输出说明
字段 | 说明 |
---|---|
Idx | 段下标 |
Name | 段标识符(名字) |
Size | 段所占空间大小 |
VMA | 段起始位置的虚存地址 |
LMA | 段所在存储空间中的加载地址 |
File off | 段在目标文件中的相对位置 |
Algn | 段的边界对齐字节数 |
size | 查看目标文件中段大小 |
strings | 查看目标文件中的字符串 |