6_开发中的辅助工具

关键词: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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容