zoukankan      html  css  js  c++  java
  • 第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

  • 相关阅读:
    散列函数的构造方法
    散列表(哈希表)查找
    散列表,哈希表,散列表查找法
    多路查找树之2-3-4树和B树
    多路查找树之2-3树的删除原理
    多路查找树之2-3树的插入原理
    多路查找树之2-3树
    字典:当索引不好用时2
    字典:当索引不好用时
    平衡二叉树的实现原理(代码实现)- 数据结构和算法78
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/7923633.html
Copyright © 2011-2022 走看看