外观
03.开发中的辅助工具
约 1120 字大约 4 分钟
嵌入式Linux单片机个人
2022-06-17
六、开发中的辅助工具
1. 什么是开发环境?
- 构建环境
- 代码编写,程序编译,版本控制(可选)
- 调试环境
- 用于定位问题的辅助工具集
- 测试环境
- 用于验证目标程序是否满足用户的显性需求和隐性需求
2. 嵌入式开发中的时间分配
- 代码编写及目标构建 (20%)
- 测试,调试,bug修复(80%)
3. 问题:如何提高开发效率?
工欲善其事,必先利其器!
4. GNU为GCC编译器提供了配套的辅助工具集(Binutils)
Binutils- GNU Project - Free Software Foundation

5. addr2line
- 将指定地址转换为对应的文件名和行号
- 常用于分析和定位内存访问错误的问题

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.oobjdump -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文件系统
- 系统日志
