欢迎光临散文网 会员登陆 & 注册

嵌入式开发/调试辅助工具

2021-08-09 11:09 作者:Vecloud_  | 我要投稿


  开发辅助工具开发环境组成通常开发环境由三部分组成:


  构建环境:包括代码编写,程序编译,版本控制等功能。


  调试环境:用于定位问题的辅助工具集


  测试环境:用于验证目标程序是否满足用户要求的显性需求和隐性需求嵌入式开发中,通常有20%的时间用于目标构建,80%的时间用于测试、调试和bug修复,工欲善其事,必先利其器,提高开发和调试效率十分重要。GNU为GCC编译器提供了配套的辅助工具集(Binutils)开发工具集addr2line将指定地址转换为对应的文件名和行号,常用于分析和定位内存错误的问题addr2line 示例:定位0地址访问


#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#include <stdio.h>int* g_pointer;void func(){        *g_pointer = (int)"D.T.Software";    return;}1、开启core dump 选项ulimit -c unlimited


2、运行程序,并生成崩溃的core文件


  执行导致程序崩溃的测序用例,执行后我们看到生成的core 文件3、读取core文件,获取IP寄存器的值(0x08048000)dmesg core


  在文件的最后几行,内容如下:


  这的地址 0x08048000 即是ip寄存器的地址。


4、使用addr2line 定位代码行


Addr2line 0x08048000 -f -e test.out


strip剔除称故乡文件中的调试信息,减少目标程序的大小一本在程序发布前都选哟将调试信息剔除


  过多的调试信息可能会影响程序的执行效率


strip test.out


  注意事项:


  几乎所有的调试辅助工具都依赖于目标文件中的调试信息调试信息的运用可以快速定位问题


  使用gcc 编译程序时使用-g 生成调试信息


  发布程序时再考虑是否使用strip 剔除调试信息ar打包目标文件, ar crs libname.a x.o y.o解压目标文件,ar x libname.a


nm列出目标文件中的标识符(变量、函数名)


  输出结果由三部分组成:{地址、段、标识符}


  段标识说明


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


objdump -S func.o


  查看目标文件中的详细段信息


objdump -h test.out


  输出说明:


  在这里我们有必要讲解一个概念:


  首先存在三个地址:虚拟内存地址,加载地址,运行地址当我们执行可执行程序a.out后:


1.操作系统为该程序分配一个进程,自然会为其分配内存(虚拟内存)。


2.加载a.out中的各个段到内存(加载地址),这里加载依据的就是上述objdump -h中的file off3.执行可执行程序(运行地址)。


size获取目标文件中的所有段大小, size test.outstrings获取目标文件中的所有字符串常量,string test.out

了解更多网络知识关注:http://www.vecloud.com/


嵌入式开发/调试辅助工具的评论 (共 条)

分享到微博请遵守国家法律