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 帮助我们找到了错误位置。

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

    关注

    4983

    文章

    18295

    浏览量

    288590
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72777
  • FreeRTOS
    +关注

    关注

    12

    文章

    473

    浏览量

    61351
  • DEBUG
    +关注

    关注

    3

    文章

    83

    浏览量

    19451
收藏 人收藏

    评论

    相关推荐

    请问"E:/CCS/driverlib/ccs/Debug/driverlib.lib", line 3: error #7: unrecognized token这个问题处在哪?

    "E:/CCS/driverlib/ccs/Debug/driverlib.lib", line 3: error #7: unrecognized token这个问题处在哪 ?driverlib.lib是TIVAWARE自带的
    发表于 08-14 06:09

    蓝牙模块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

    何用PCA9685完成无刷电机的驱动方法?

    怎样编写i2c驱动的函数?如何用PCA9685完成无刷电机的驱动方法?
    发表于 07-21 07:02

    何用RTC实现钟表功能

    如何使用stm32 RTC(实时时钟)?如何用RTC实现钟表功能?
    发表于 09-28 09:25

    何用DAC实现输出2KHz正弦波呢

    PWM是什么?如何用DAC实现输出2KHz正弦波呢?
    发表于 11-15 06:14

    何用STM32 GPIO模拟SPI呢

    何用STM32 GPIO模拟SPI呢?怎样编写AD7192的源码呢?
    发表于 11-17 07:09

    如何解决STM32 Debug无法添加断点的问题呢

    STM32 Debug为什么不能添加断点呢?如何解决STM32 Debug无法添加断点的问题呢?
    发表于 11-25 08:46

    如何在开发板子上安装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

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

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

    Linux中addr2line用法介绍

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

    linux下调试core dump的方法

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