开发环境的概念 1.构建环境--代码编写,程序编译,版本控制 2.调试环境--用于定位问题的辅助工具集 3.测试环境--用于验证目标程序是否满足用户的显性需求和隐性需求 一般的嵌入式开发中的时间分配--代码编写及目标构建(20%) 测试 调试 修复(80%)
GNU为GCC编译器提供了配套的辅助工具集 在提供的网站上可以看出,提供的工具以及功能的介绍 A.addr2line 1.将指定地址转换为对应的文件名和行号 2.常用于分析和定位内存访问错误的问题
addr2line示例:定位0地址访问 1.开启core dump选项--ulimit -c unlimited 2.运行程序,并生成崩溃时的core文件--执行导致程序崩溃的测试用例 3.读取core文件,获取IP寄存器的值--dmesg core 4.使用addr2line定位行代码--addr2line (地址) -f -e test
两个.c代码如下
#include <stdio.h>
int* g_pointer;
void func()
{
*g_pointer = (int)"D.T.Software";
return;
}
#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;
}
由func.c的(*g_pointer全局变量 没有进行初始化)可以看出该指针指向的是空,所以在运行会出现错误----(-g是打印调试信息) 该示例完整的展示了addr2line的功能
B.strip 1.剔除程序文件中的调试信息,减少目标程序的大小 2.一般在程序发布前都需要将调试信息剔除 3.过多的调试信息可能影响程序的执行效率 由上图可以看出 调试后的test.out的文件大小与运行了strip之后的文件大小的对比 注意事项: 1.几乎所有的调试辅助工具都依赖与目标文件中的调试信息 2.调试信息的运用都能够快速定位问题 3.使用gcc编译程序时使用-g选项生成调试信息 4.发布程序时再考虑是否使用strip剔除调试信息
C.ar 1.打包文件--ar crs libname.a x.o y.o 2.解压目标文件--ar x libname.a 展示了 ar命令 打包与解压的操作
D.nm 1.列出目标文件在的标识符(变量名,函数名) 2.输出结果由三部分组成(地址,段,标识符) E.size 与strings 1.size--获取目标文件在的所有大小--size test.out 2.strings--获取目标文件中的所有字符串常量--strings test.out