第6课 - 开发中的辅助工具
1. 什么是软件开发环境?
(1)构建环境:代码编写、程序编译、版本控制(可选)
初级程序开发者往往把软件开发等同于 代码编写 + 程序编译 ,这是狭隘且错误的;个人开发只要及时备份即可,团队开发需要版本控制的协助。
(2)调试环境:在开发软件时,不可能一次编写成功,肯定会出现bug,这就需要调试工具。在软件开发中,调试工具是用于定位问题的辅助工具集。
(3)测试环境:用于验证目标程序是否满足用户的显性需求和隐性需求。
2. 嵌入式开发中的时间分配
— 代码编写及目标构建(20%)
— 测试、调试、bug修复(80%)
3. 如何提高开发效率?
工欲善其事,必先利其器。这个 “器” 就是 GNU 为 GCC 编译器提供的配套的辅助工具集(Binutils:二进制工具包)。
GNU Binutils官方简介: https://www.gnu.org/software/binutils/
Binutils工具集详细介绍:https://sourceware.org/binutils/docs-2.28/binutils/index.html
工具名 | 功能简介 |
addr2line | 将代码地址转换为对应的程序行号 |
strip | 剔除可执行程序中的调试信息 |
ar | 将目标文件打包成静态库 |
nm | 列出目标文件中的符号及对应地址 |
objdump | 查看程序段信息及反汇编 |
size | 查看目标文件中的段大小 |
strings | 查看目标文件中的字符串 |
3.1 addr2line
(1)addr2line工具的功能
-
- 将指定地址转换为对应的文件名和行号
- 常用于分析和定位内存访问错误的问题
(2)addr2line使用示例:定位 0 地址访问
<1> 开启core dump选项
-
-
- ulimit -c unlimited
-
<2> 运行程序,并生成崩溃时的 core 文件
-
-
- 执行导致程序崩溃的测试用例
-
<3> 读取 core 文件,获取 IP 寄存器的值(0x08048000)
-
-
- dmesg core
-
<4> 使用 addr2line 定位行代码
-
-
- addr2line 0x08048000 -f -e test.out
-
3.2 strip
(1)strip工具的功能
-
- 剔除可执行程序中的调试信息,较少目标程序的大小
-
- 一般在程序发布前都需要将调试信息剔除
-
- 过多的调试信息可能影响程序的执行效率
-
- 用法: strip test.out
(2)使用 strip 的注意事项
-
- 几乎所有的调试辅助工具都依赖于目标文件中的调试信息
-
- 调试信息的运用能够快速定位问题
-
- 使用 gcc 编译程序时使用 -g 选项生成调试信息
-
- 发布程序时再考虑是否使用 strip 剔除调试信息
3.3 ar
— 打包目标文件
-
- ar crs libname.a x.o y.o
— 解压目标文件
-
- ar x libname.a
3.4 nm
(1)nm工具的功能
-
- 列出目标文件中的标识符(变量名,函数名)
-
- 输出结果由三部分组成:{地址,段,标识符}
示例:
(2)段标识说明
段标识 | 说明 |
A | 地址值在链接过程中不会发生改变 |
B 或 b | 标识符位于未初始化数据段(.bss) |
C | 未定义存储段的标识符,链接时决定段位置 |
D 或 d | 标识符位于数据段(.data) |
N | 调试专用标识符 |
R 或 r | 标识符位于只读存储区(.rdata) |
T 或 t | 标识符位于代码段(.text) |
U | 未定义的标识符 |
3.5 objdump
(1)objdump工具的功能
-
- 反汇编目标文件,查看汇编到源码的映射
objdump -d func.o
obidump -S func.o
-
- 查看目标文件中的详细段信息
obidump -h test.out
(2)objdump -h 的输出说明
说明 | |
ldx | 段下标 |
Name | 段标识符(名字) |
Size | 段所占空间的大小 |
VMA | 段起始位置的虚存地址 |
LMA | 段在存储空间中的加载地址 |
File off | 段在目标文件中的相对位置 |
Algn | 段的边界对齐字节数 |
3.6 size
size 用于获取目标文件中的所有段大小
-
- size test.out
3.7 strings
strings 用于获取目标文件中的所有字符串常量
-
- strings test.out
注:本文整理于《狄泰12月提升计划》课程内容
狄泰QQ群:199546072