六、开发中的辅助工具
1. 什么是开发环境?
- 构建环境
- 代码编写,程序编译,版本控制(可选)
- 调试环境
- 用于定位问题的辅助工具集
- 测试环境
- 用于验证目标程序是否满足用户的显性需求和隐性需求
2. 嵌入式开发中的时间分配
- 代码编写及目标构建 (20%)
- 测试,调试,bug修复(80% )
3. 问题:如何提高开发效率?
工欲善其事,必先利其器!
4. GNU为GCC编译器提供了配套的辅助工具集(Binutils)
Binutils- GNU Project - Free Software Foundation
5. addr2lne
- 将指定地址转换为对应的文件名和行号
- 常用于分析和定位内存访问错误的问题
6. addr2line示例:定位0地址访问
- 开启core dump 选项
- ulimit -c unlimited
- 记录程序崩溃的最后一刻,内存布局和寄存器的值
- 运行程序,并生成崩溃时的core文件
- 执行导致程序崩溃的测试用例
- 读取core文件,获取IP寄存器的值( 0x08048000 )
- dmesg core
- 使用addr2line定位代码行
- addr2line 0x08048000 -f -e test.out
ip寄存器访问地址时出现段错误
7. strip
- 剔除程序文件中的调试信息,减少目标程序的大小
- 一般在程序发布前都需要将调试信息剔除
- 过多的调试信息可能影响程序的执行效率
strip test.out
8. 注意事项
- 几乎所有的调试辅助工具都依赖于目标文件中的调试信息
- 调试信息的运用能够快速定位问题
- 使用 gcc 编译程序时使用 -g 选项生成调试信息
- 发布程序时再考虑是否使用 strip 剔除调试信息
9. ar
- 打包目标文件
- ar crs libname.a x.o y.o
- 解压目标文件
- ar x libname.a
10. nm
- 列出目标文件中的标识符(变量名,函数名)
- 输出结果由三部分组成:{地址,段,标识符}
段标识说明
由于未链接,所以地址都是相对偏移地址。
链接后,地址就是程序运行时实际地址。
11. objdump
- 反汇编目标文件,查看汇编到源码的映射
- objdump -d func.o
- objdump -S func.o
- 用于检查时序错误、编译器优化错误。
- 查看目标文件中的详细段信息
- objdump -h test.out
objdump -h的输出说明
12. size
- 获取目标文件中的所有段大小
- size test.out
- 嵌入式设备时,可能存在资源限制。有可能进行优化,保证每个段都可以顺利的存储到设备中去。
13. strings
- 获取目标文件中的所有字符串常量
- strings test.out
- 嵌入式设备时,可能存在资源限制。字符串常量会占用资源,可以获得所有字符串常量。
一、编译阶段
nm 获取二进制文件包含的符号信息
strings 获取二进制文件包含的字符串常量
strip 去除二进制文件包含的符号
readelf 显示目标文件详细信息
objdump 尽可能反汇编出源代码
addr2line 根据地址查找代码行
二、运行阶段
gdb 强大的调试工具(略)
gdb core gdb查看core文件
ldd 显示程序需要使用的动态库和实际使用的动态库
strace 跟踪程序当前的系统调用
ltrace 跟踪程序当前的库函数
time 查看程序执行时间、用户态时间、内核态时间
gprof 显示用户态各函数执行时间
valgrind 检查内存错误
mtrace 检查内存错误
三、其他
proc文件系统
系统日志
来自 <linux常用调试工具简介_zhliu1991的博客-CSDN博客>