美文网首页
6_开发中的辅助工具

6_开发中的辅助工具

作者: 编程半岛 | 来源:发表于2018-03-29 13:27 被阅读23次

关键词:addr2linestriparnmobjdumpsizestrings

1. 什么是开发环境?

  • 构建环境:代码编写,程序编译,版本控制(可选)
  • 调试环境:用于定位问题的辅助工具集
  • 测试环境:用于验证目标程序是否满足用户的显性需求和隐形需求
    GNU为GCC编译器提供配套的辅助工具集

2. addr2line

  • 将指定地址转换为对应的文件名行号
  • 常用于分析和定位内存访问错误的问题
  • addr2line示例:定位0地址访问
    1)开启core dump选项:ulimit -c unlimited
    2)运行程序,并生成崩溃时的core文件:执行导致程序崩溃的测试用例
    3)读取core文件,获取IP寄存器的值(0x08048000):dmesg core
    4)使用addr2line定位代码行:addr2line 0x08048000 -f -e test.out
    注意: test.out需要是调试版本的,即在编译或链接时需要加上-g选项

示例代码:
func.c

#include <stdio.h>

int* g_pointer;

void func()
{
  *g_pointer = (int)"D.T.Software";
    return;
}

test.c

#include <stdio.h>

int g_global = 0;
int g_test = 1;

extern int* g_pointer;
extern void func();

int main(int argc, char *argv[])
{
    printf("&g_global = %p\n", &g_global);
    printf("&g_test = %p\n", &g_test);
    printf("&g_pointer = %p\n", &g_pointer);
    printf("g_pointer = %p\n", g_pointer);
    printf("&func = %p\n", &func);
    printf("&main = %p\n", &main);

    func();

    return 0;
}

addr2line使用方法:
1)首先生成调试版本的test.out文件:gcc -g test.c func.c -o test.out
2)开启core dump选项:ulimit -c unlimited
3)执行test.out./test.out
4)读取core文件,获取IP寄存器的值:dmesg core
5)使用addr2line定位代码行:addr2line 0x08048469 -f -e test.out

输出结果:

func
/home/delphi/code/ch2/5/func.c:7

第一行表示程序发生崩溃的函数名;
第二行表示段错误的文件地址和行号

3. strip

  • 剔除程序文件中的调试信息,减少目标成表程序的大小
  • 一般在程序发布前都需要将调试信息剔除
  • 过多的调试信息可能影响程序的执行效率
  • 使用方法:strip test.out
  • 注意事项:
    1)几乎所有的调试辅助工具都依赖于目标文件中的调试信息
    2)调试信息的运用能够快速定位问题
    3)使用gcc编译器时使用-g选项生成调试信息
    4)发布程序时再考虑是否使用strip剔除调试信息

4. ar

  • 打包目标文件:
    ar crs libname.a x.o y.o:将.o文件打包到libname.a静态库文件中
  • 解压目标文件:
    ar x libname.a:将libname.a静态库文件解压为.o文件

5. nm

  • 列出目标文件中的标识符(变量名,函数名)
  • 输出结果由三部分组成:{地址, 段, 标识符}
  • 用法:nm fillename.o(.out)

6. objdump

  • 反汇编目标文件,查看汇编到源码的映射
    objdump -d func.o

    objdump -S func.o
  • 查看目标文件中的详细段信息
    objdump -h func.o

objdump -h的输出说明:
1) idx:段下标
2)Name:段标识符(名字)
3)Size:段所占空间的大小
4)VMA( Virtual Memory Address):段起始位置的虚存地址
5)LMA(Load Memory Address):段在存储空间中的加载地址
6)File off:段在目标文件中的相对位置,即偏移位置
7)Algn:短的边界对齐字节数

7. size

  • 获取目标文件中的所有段大小
    size test.out

8. strings

  • 获取目标文件中的所有字符串常量
    strings test.out

声明:此文章为本人在学习狄泰软件学院《十二月提升计划》所做的笔记,参考书籍《专业嵌入式软件开发》——李云,文章中包含狄泰软件资料内容和《专业嵌入式软件开发》资料内容,一切版权归狄泰软件《专业嵌入式软件开发》所有!

相关文章

网友评论

      本文标题:6_开发中的辅助工具

      本文链接:https://www.haomeiwen.com/subject/njuucftx.html