0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何用addr2line去debug

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-30 10:20 次阅读

Linux 下写 C/C++ 程序的程序员,时常与 Core Dump 相见。在内存越界访问,收到不能处理的信号,除零等错误出现时,我们精心或不精心写就的程序就直接一命呜呼了,Core Dump 是 Linux 仁慈地留下的程序的尸体,帮助程序员们解决了一个又一个问题。

有时配置不给力,Linux 直接毁尸灭迹,没有了 Core 文件;又有时,刚好磁盘空间不足,Core文件写不下了。没有 Core 文件的时候,如何知道程序在什么地方出错了呢?addr2line 就在这时派上用场。

这是一个示例程序,func 函数返回参数 a 除以参数 b 的结果。这里使用 0 作为除数,结果就是程序因为除以 0 导致错误,直接中断了。

test.c

#include < stdio.h >
 
int func(int a, int b)
{
  return a / b;
}
 
int main()
{
  int x = 10;
  int y = 0;
  printf("%d / %d = %dn", x, y, func(x, y));
  return 0;
}

编译:-o 指定输出文件名,-g 会有调试信息

gcc -o test -g test.c

执行

./test

提示执行错误

图片

输入 dmesg 命令,查看 log,提示如下:

traps: test[2184] trap divide error ip:400534 sp:7ffee5779a90 error:0 in test[400000+1000]

ip 字段后面的数字就是 test 程序出错时所程序执行的位置。使用 addr2line 就可以 将 400534 地址转换出对应的文件及行数

图片

可知,程序在执行到 test.c 文件第五行的时候,执行出错,我们检查第五行代码。

return a / b;

这里除 0 肯定是不行的,addr2line 帮助我们找到了错误位置。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5070

    文章

    19024

    浏览量

    303479
  • 内存
    +关注

    关注

    8

    文章

    3004

    浏览量

    73898
  • FreeRTOS
    +关注

    关注

    12

    文章

    483

    浏览量

    62018
  • DEBUG
    +关注

    关注

    3

    文章

    90

    浏览量

    19888
收藏 人收藏

    评论

    相关推荐

    在wsl2中安装的idf,在monitor时会报错的原因?

    的 target 均配置正确 但是好像调用了 esp32 的addr2line工具,不想重新安装idf了,求解,ballball大佬们
    发表于 06-17 07:30

    蓝牙模块HC-05中linelen=get_line(linebuff,redata+getlen+2*linenum,len);为什么linenum要*2

    linelen = get_line(linebuff,redata+getlen+2*linenum,len);这句语句linenum为什么要*2/*** @brief扫描周边的蓝牙设备,并存储到
    发表于 04-24 06:35

    如何在开发板子上安装addr2line工具?

    由于软件在开发板上会有些难以复现的闪退类型bug需要借助addr2line 解析错误,打印函数堆栈,需要用到这个工具。目前的Ubuntu里边有arm的交叉编译工具,在linux下是可以的,但是在
    发表于 01-07 07:08

    C语言在ARM中函数调用时栈变化的过程

    为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash, oops等棘手问题,一般大家都会用 gdb, objdump 或者 addr2line等工具分析 pc 位置来定位出错...
    发表于 02-14 07:02

    一步步介绍CmBacktrace的相关知识和使用方法

    繁杂的故障寄存器;输出错误现场的函数调用栈 (需配合 addr2line 工具进行精确定位),还原发生错误时的现场信息,定位问题代码位置、逻辑更加快捷、精准。也可以在正常状态下使用该库,获取当前的函数
    发表于 10-26 15:44

    在wsl2中安装的idf,在monitor报错的原因?如何解决?

    均配置正确 但是好像调用了 esp32 的addr2line工具,不想重新安装idf了,求解,ballball大佬们
    发表于 02-14 07:56

    当On Line Debug时,会无缘无故的离线是为什么?

    当我On Line Debug 时 ,会无缘无故的离线。 当时我的目标板有连接主电源。 例如 24BLDC 板。低速都OK 操过某一个速度,就直接离线。 有阶主电源时也无法下载程式或Debug?
    发表于 09-06 08:02

    何用2SC2539替换2SC1971

    何用2SC2539替换2SC1971
    发表于 12-22 11:40 3161次阅读

    NCV8402ADDR2G双路MOS管的特性及应用

    提及“双路场效应管NCV8402ADDR2G”,作为业内人士,定不觉得陌生。NCV8402ADDR2G这个物料,带短路、过热保护的双路MOS管,出自国际品牌ON(安森美)。NCV8402ADDR2
    发表于 08-09 17:17 2982次阅读

    何用示波器测量脉冲信号呢

    何用示波器测量脉冲信号以及测量脉冲信号对示波器有什么要求。
    的头像 发表于 10-04 08:49 1.6w次阅读

    C语言在ARM中函数调用时,栈是如何变化的?

    为什么会写篇栈变化的文章?做系统分析的话你肯定遇到过一些crash, oops等棘手问题,一般大家都会用 gdb, objdump 或者 addr2line等工具分析 pc 位置来定位出错...
    发表于 12-09 10:36 8次下载
    C语言在ARM中函数调用时,栈是如何变化的?

    NCV8402ADDR2G,原装正品,价格美丽

    提及“双路场效应管NCV8402ADDR2G”,作为业内人士,定不觉得陌生。NCV8402ADDR2G这个料号,带短路、过热保护的双路MOS管,出自国际品牌ON(安森美)。NCV8402ADDR2
    的头像 发表于 11-12 11:55 904次阅读
    NCV8402<b class='flag-5'>ADDR2</b>G,原装正品,价格美丽

    Linux中addr2line用法介绍

    addr2line 用法 -a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。 -b --target=:指定目标文件的格式为bfdname。 -e --exe
    的头像 发表于 07-30 10:20 1166次阅读

    linux下调试core dump的方法

    ,了解系统的启动信息,可以获得出错堆栈地址。 addr2line ,可以将指令的地址和可执行映像转换成文件名,函数名或源代码的工具。这种功能将跟踪地址转换成更有意义的内容来说很有用。 在调用
    的头像 发表于 10-08 16:13 611次阅读

    RVBacktrace RISC-V极简栈回溯组件

    RVBacktrace组件简介一个极简的RISC-V栈回溯组件。功能在需要的地方调用组件提供的唯一API,开始当前环境的栈回溯支持输出addr2line需要的命令,使用addr2line进行栈回溯支持结合反汇编,栈回溯信息图表化TODOList:支持打印
    的头像 发表于 09-15 08:12 314次阅读
    RVBacktrace RISC-V极简栈回溯组件