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

第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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值