第6课 - 开发中的辅助工具

时间:2023-02-09 20:29:55

第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工具的功能

    • 列出目标文件中的标识符(变量名,函数名)
    • 输出结果由三部分组成:{地址标识符

      示例:

          第6课 - 开发中的辅助工具

 

  (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