关键词:addr2line
、strip
、ar
、nm
、objdump
、size
、strings
1. 什么是开发环境?
- 构建环境:代码编写,程序编译,版本控制(可选)
- 调试环境:用于定位问题的辅助工具集
- 测试环境:用于验证目标程序是否满足用户的显性需求和隐形需求
GNU为GCC编译器提供配套的辅助工具集
2. addr2line
- 将指定地址转换为对应的文件名和行号
- 常用于分析和定位内存访问错误的问题
-
addr2line
示例:定位0地址访问
1)开启core dump
选项:ulimit -c unlimited
2)运行程序,并生成崩溃时的core文件:执行导致程序崩溃的测试用例
3)读取core文件,获取IP寄存器的值(0x08048000):dmesg core
4)使用addr2line
定位代码行:addr2line 0x08048000 -f -e test.out
注意: test.out需要是调试版本的,即在编译或链接时需要加上-g
选项
示例代码:
func.c
#include <stdio.h>
int* g_pointer;
void func()
{
*g_pointer = (int)"D.T.Software";
return;
}
test.c
#include <stdio.h>
int g_global = 0;
int g_test = 1;
extern int* g_pointer;
extern void func();
int main(int argc, char *argv[])
{
printf("&g_global = %p\n", &g_global);
printf("&g_test = %p\n", &g_test);
printf("&g_pointer = %p\n", &g_pointer);
printf("g_pointer = %p\n", g_pointer);
printf("&func = %p\n", &func);
printf("&main = %p\n", &main);
func();
return 0;
}
addr2line
使用方法:
1)首先生成调试版本的test.out
文件:gcc -g test.c func.c -o test.out
2)开启core dump
选项:ulimit -c unlimited
3)执行test.out
:./test.out
4)读取core文件,获取IP寄存器的值:dmesg core
5)使用addr2line
定位代码行:addr2line 0x08048469 -f -e test.out
输出结果:
func
/home/delphi/code/ch2/5/func.c:7
第一行表示程序发生崩溃的函数名;
第二行表示段错误的文件地址和行号
3. strip
- 剔除程序文件中的调试信息,减少目标成表程序的大小
- 一般在程序发布前都需要将调试信息剔除
- 过多的调试信息可能影响程序的执行效率
- 使用方法:
strip test.out
- 注意事项:
1)几乎所有的调试辅助工具都依赖于目标文件中的调试信息
2)调试信息的运用能够快速定位问题
3)使用gcc编译器时使用-g
选项生成调试信息
4)发布程序时再考虑是否使用strip
剔除调试信息
4. ar
- 打包目标文件:
ar crs libname.a x.o y.o
:将.o
文件打包到libname.a
静态库文件中 - 解压目标文件:
ar x libname.a
:将libname.a
静态库文件解压为.o
文件
5. nm
- 列出目标文件中的标识符(变量名,函数名)
- 输出结果由三部分组成:{地址, 段, 标识符}
- 用法:
nm fillename.o(.out)
6. objdump
- 反汇编目标文件,查看汇编到源码的映射
objdump -d func.o
objdump -S func.o
- 查看目标文件中的详细段信息
objdump -h func.o
objdump -h
的输出说明:
1) idx:段下标
2)Name:段标识符(名字)
3)Size:段所占空间的大小
4)VMA( Virtual Memory Address):段起始位置的虚存地址
5)LMA(Load Memory Address):段在存储空间中的加载地址
6)File off:段在目标文件中的相对位置,即偏移位置
7)Algn:短的边界对齐字节数
7. size
- 获取目标文件中的所有段大小
size test.out
8. strings
- 获取目标文件中的所有字符串常量
strings test.out
声明:此文章为本人在学习狄泰软件学院《十二月提升计划》所做的笔记,参考书籍《专业嵌入式软件开发》——李云,文章中包含狄泰软件资料内容和《专业嵌入式软件开发》资料内容,一切版权归狄泰软件和《专业嵌入式软件开发》所有!