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

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

3天内不再提示

linux下调试core dump的方法

麦辣鸡腿堡 来源:盼盼编程 作者:晨梦思雨 2023-10-08 16:13 次阅读

下面说明一下 linux 下调试 core dump 方法。

dmesg+addr2line调试

先介绍 2 个 linux 命令:

dmesg ,一种程序,用于检测和控制内核缓冲。程序用来帮助用户,了解系统的启动信息,可以获得出错堆栈地址。

addr2line ,可以将指令的地址和可执行映像转换成文件名,函数名或源代码的工具。这种功能将跟踪地址转换成更有意义的内容来说很有用。

在调用 addr2line 工具时,要使用 -e 选项来指定可执行映像,使用 -f 选项可以告诉工具输出函数名。

linux下操作过程:

[root@VM-16-9-centos c++]# dmesg | grep a.out 
[  212.330289] a.out[1946]: segfault at 0 ip 0000000000400571 sp 00007ffdf0aafbb0 error 6 in a.out[400000+1000]
[  227.437065] a.out[1989]: segfault at 0 ip 0000000000400571 sp 00007ffcfd01c8c0 error 6 in a.out[400000+1000]
[root@VM-16-9-centos c++]# 
[root@VM-16-9-centos c++]# addr2line -e a.out 0000000000400571
/root/c++/main.cpp:6

先通过dmesg找到对应出错的地址,再用 addr2line -e 将地址解析到对应的代码行。

gdb调试

gdb 想必大家都有听说,Linux 下面一款常用的的调试工具。
gdb 编译器通常以 gdb 命令的形式在终端中使用,下面学习下常用调试选项。

bt :查看堆栈信息

i locals :查看当前程序栈的局部变量

i args :查看当前程序栈的参数

i catch :查看当前程序中栈帧的异常处理器

p a :打印变量的值

i register :查看当前寄存器的值

r :从运行程序至第一个断点,没有断点则一直运行完

quit :退出

gdb调试过程中,输入 r ,bt。r 是运行 a.out 文件,bt查看堆栈情况。
我们不需要执行 gdb a.out,这样就相当于重新运行了 a.out 文件。然而在实际开发中,有很多问题都是概率发生的,所以此方法不太实用。

linux下操作过程(省略部分 gdb 介绍信息):

[root@VM-16-9-centos c++]# gdb a.out core.1989 
Reading symbols from /root/c++/a.out...done.
[New LWP 1989]
bCore was generated by `./a.out'.
Program terminated with signal 11, Segmentation fault.
#0  0x0000000000400571 in main () at main.cpp:6
6        *p=0;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-307.el7.1.x86_64 libgcc-4.8.5-44.el7.x86_64 libstdc++-4.8.5-44.el7.x86_64
(gdb) bt
#0  0x0000000000400571 in main () at main.cpp:6
(gdb)

直接执行 gdb a.out core.1989,不用 r 命令避免程序重复执行。使用 bt 命令,可以看到程序出错代码行。

strace+addr2line调试

strace 是一个集诊断、调试、统计与一体的工具,我们可以使用strace,对应用的系统调用和信号传递的跟踪结果,来对应用进行分析,以达到解决问题,或者是了解应用工作过程的目的。

strace 的简单的用法就是,执行一个指定的命令,在指定的命令结束之后,它也就退出了。
在命令执行的过程中,strace 会记录和解析命令进程的所有系统调用,以及这个进程所接收到的,所有的信号值。

-c ,统计每一系统调用的所执行的时间,次数和出错的次数等

-p ,指定进程pid
-i ,输出系统调用的入口指针

linux 下操作过程(省略部分加载信息):

[root@VM-16-9-centos c++]# strace -i ./a.out 
[00007f79d3573847] munmap(0x7f79d3772000, 31038) = 0
[0000000000400571] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
[????????????????] +++ killed by SIGSEGV (core dumped) +++
Segmentation fault
[root@VM-16-9-centos c++]# addr2line -e a.out 0000000000400571
/root/c++/main.cpp:6
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11304

    浏览量

    209506
  • 调试
    +关注

    关注

    7

    文章

    578

    浏览量

    33943
  • 程序
    +关注

    关注

    117

    文章

    3787

    浏览量

    81047
  • 系统
    +关注

    关注

    1

    文章

    1017

    浏览量

    21345
收藏 人收藏

    评论

    相关推荐

    ESP32_MINI烧录程序后遇到esp_core_dump_flash问题怎么解决?

    ) esp_core_dump_flash: Core dump flash config is corrupted! CRC=0x7bd5c66f instead of 0x0 Rebooting... ets
    发表于 07-01 06:52

    关于系统应用core dump的分析

    解决段错误,系统应用core dump的分析 这个错误在单片机上往往以hardfault的错误出现,分析思路都是分析堆栈的位置;单片机的编译软件,如果可以仿真(比如keil或者IAR),复现故障
    发表于 03-02 06:10

    你知道Linux Core Dump是什么?

    当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。
    发表于 05-10 11:11 2834次阅读

    学会用core dump调试程序错误

    . 在嵌入式系统中,有时core dump直接从串口打印出来,结合objdump查找ra和epa地址,运用栈回溯,可以找到程序出错的地方。
    发表于 05-16 16:44 1302次阅读
    学会用<b class='flag-5'>core</b> <b class='flag-5'>dump</b><b class='flag-5'>调试</b>程序错误

    段错误调试神器 - Core Dump详解

    地址。通过系统服务启动的进程也可通过这一方法查看。 9. 嵌入式设备下如何使用Core dump: linux coredump配置与调试
    发表于 04-02 14:34 1171次阅读

    虚拟机:Linux设置core dump文件名的格式

    虚拟机:Linux设置core dump文件名的格式
    的头像 发表于 06-22 17:50 2930次阅读
    虚拟机:<b class='flag-5'>Linux</b>设置<b class='flag-5'>core</b> <b class='flag-5'>dump</b>文件名的格式

    linux中的core dump调试与运用详解

    调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。
    的头像 发表于 04-12 14:24 2126次阅读

    使用 VSCode 远程 图形化 GDB 调试 嵌入式linux

    目录标题引言环境步骤vscode remote ssh 配置Linux编译机配置设备板端配置vscode launch设置调试引言之前说了,通过core dump找程序bug,但是有
    发表于 11-01 17:06 1次下载
    使用 VSCode 远程 图形化 GDB <b class='flag-5'>调试</b> 嵌入式<b class='flag-5'>linux</b>

    嵌入式Linux如何生成Core Dump文件

    运行,二者有何区别 前台运行和后台运行的区别 前后台程序生成core dump时有何区别 前台进程如何生成core dump 后台进程如何生成
    发表于 11-01 17:21 17次下载
    嵌入式<b class='flag-5'>Linux</b>如何生成<b class='flag-5'>Core</b> <b class='flag-5'>Dump</b>文件

    Core 1808 JD4资源linux header/linux image

    电子发烧友网站提供《Core 1808 JD4资源linux header/linux image.txt》资料免费下载
    发表于 09-20 16:58 10次下载
    <b class='flag-5'>Core</b> 1808 JD4资源<b class='flag-5'>linux</b> header/<b class='flag-5'>linux</b> image

    hypervisor的调试分析方法

    我们在编写裸机程序(baremetal)、虚拟化管理程序(hypervisor)和操作系统(OS)时,Debug分析程序是必不可少的。不像linux内核,有大量的调试方法,很多裸机程序、hypervisor没有完善的
    的头像 发表于 10-08 09:40 1447次阅读

    使用gdb对core文件进行调试

    Linux下,一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试
    的头像 发表于 10-26 11:12 8619次阅读

    VCD/FSDB/SHM/VPD波形dump方法

    仿真是IC设计不可或缺的重要步聚,其中仿真波形是debug的必要条件。今天简要介绍下一下几种波形文件VCD/FSDB /SHM/VPD的dump方法
    的头像 发表于 11-11 09:36 1.7w次阅读

    在程序中什么是core dump

    调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。 从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没
    的头像 发表于 10-08 16:07 968次阅读

    jvm的dump太大了怎么分析

    文件需要耗费大量的时间和计算资源。 然而,这并不意味着我们无法分析和利用JVM dump文件。以下是一些方法和技巧,可帮助我们有效地分析大型JVM dump文件。 使用工具:首先,我们可以使用一些专门用于分析JVM
    的头像 发表于 12-05 11:01 2669次阅读