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

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

3天内不再提示

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

Linux爱好者 来源:CSDN技术社区 作者:晨梦思雨 2021-04-12 14:24 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

缘起

调试,是开发流程中一个非常重要的环节。每个程序员都应,具备调试代码的能力,尤其对于从事 Linux 下的开发的读者。

从事 linux 下后台开发,有时候会遇到程序突然崩溃的情况,也没有任何日志,这会让你不知所措。

今天给大家介绍一个 core 文件,用这个文件,我们可以找出对应出错的代码行,感觉是不是很神奇。

透着树荫看着朦胧的太阳,晒着日光浴,感觉还不错。先学完这篇,我们再去欣赏风景。

什么是core dump

对于程序,由于各种异常或者 bug,导致在运行过程中,并且在满足一定条件下,产生一个叫做 core 的文件。

通常情况下,core 文件会包含了,程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等。

许多程序出错的时候,会产生一个 core 文件。通过工具分析这个文件,我们可以定位到,程序异常退出的时候对应的堆栈调用等信息。

打开 core dump 开关:ulimit -c unlimited

看一段有问题的代码:

#include《stdio.h》

int main()

{

int *p=NULL;

*p=0;

printf(“bad

”);

return 0;

}

linux下编译和执行:

[root@VM-16-9-centos c++]# g++ -g main.cpp

[root@VM-16-9-centos c++]# 。/a.out

Segmentation fault (core dumped)

[root@VM-16-9-centos c++]# ls

a.out core.1989 main.cpp

上述代码一看就有错误,执行会产生 core dump。但是在大型项目中,用肉眼就很难看了。下面说明一下 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 调试技巧很重要,平时用到的也会很多,掌握好这些很关键。通过这篇文章,希望读者能对 core dump 调试有大致了解。
编辑:lyn

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

    关注

    88

    文章

    11627

    浏览量

    217891
  • Core
    +关注

    关注

    0

    文章

    175

    浏览量

    44058

原文标题:linux 下调试 core dump 方式汇总,工作必备技能

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【迅为工业RK3568稳定可靠】itop-3568开发板Linux驱动开发实战:RK3568内核模块符号导出详解

    【迅为工业RK3568稳定可靠】itop-3568开发板Linux驱动开发实战:RK3568内核模块符号导出详解
    的头像 发表于 11-21 13:25 634次阅读
    【迅为工业RK3568稳定可靠】itop-3568开发板<b class='flag-5'>Linux</b>驱动开发实战:RK3568内核模块符号导出<b class='flag-5'>详解</b>

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板进行GDB调试

    GDB(GNU Project Debugger)是在Linux环境下功能全面的调试工具。它提供了一系列强大的调试功能,包括设置断点、单步执行、打印与观察变量、查看寄存器及堆栈信息等。在Lin
    的头像 发表于 11-11 13:47 4910次阅读
    ElfBoard技术贴|如何在【RK3588】ELF 2开发板进行GDB<b class='flag-5'>调试</b>

    在Windows和Linux环境下分别使用Olimex和蜂鸟调试器下载程序

    ://doc.nucleisys.com/hbirdv2/quick_start/sdk.html 的说明进行操作。 在Linux系统下使用Olimex ARM-USB-TINY-H调试器时,在完成gcc
    发表于 10-31 08:26

    Linux基础命令which详解

    Linux系统,which命令用于查找并显示指定命令的可执行文件路径。这对于系统管理员和开发人员来说是一个非常有用的工具,可以帮助定位命令所在的位置,确认命令是否已正确安装,并且能够用于配置环境变量等任务。下面是华纳云对which命令的详细解释。
    的头像 发表于 07-29 17:58 582次阅读

    Linux系统中网络配置详解

    网络配置是Linux系统运维的核心技能之一。正确理解和配置子网掩码、网关等网络参数,直接影响系统的网络连通性和性能。本文将深入探讨Linux系统中网络配置的方方面面,为运维工程师提供全面的技术指导。
    的头像 发表于 07-17 11:01 860次阅读

    Linux系统iptables防火墙配置详解

    iptables是Linux内核中用于配置防火墙规则的工具。它基于Netfilter框架,可以对通过网络接口的数据包进行过滤、修改等操作。通过设置一系列规则,iptables能够控制哪些数据包可以进入或离开系统,从而实现网络安全防护等功能。
    的头像 发表于 06-18 15:25 759次阅读

    2.0.0版本的ST Edge AI Corelinux平台上可以把量化后的onnx模型转换为.nb,但是运行报错,缺少文件,为什么?

    2.0.0版本的ST Edge AI Core工具在linux平台上应该是可以把量化后的onnx模型转换为.nb,但是运行报错,缺少文件。
    发表于 06-17 06:29

    安徽京准:北斗卫星同步时钟的安装与调试详解

    安徽京准:北斗卫星同步时钟的安装与调试详解
    的头像 发表于 06-05 10:08 1094次阅读
    安徽京准:北斗卫星同步时钟的安装与<b class='flag-5'>调试</b><b class='flag-5'>详解</b>

    详解Linux系统的服务管理

    Linux,无论何时当你安装任何带有服务和守护进程的包,系统默认会把这些服务的初始化及 systemd脚本添加进去,不过此时它们并没有被启用。
    的头像 发表于 05-23 15:10 619次阅读
    <b class='flag-5'>详解</b><b class='flag-5'>Linux</b>系统<b class='flag-5'>中</b>的服务管理

    如何使用S32DS在MPC5775B并行运行两个内核(core0 和 core2)?

    谁能帮我了解如何使用 S32DS 在 MPC5775B 并行运行两个内核(core0 和 core2)?
    发表于 03-31 06:27

    电力电子的坐标变换详解

    电力电子的坐标变换详解 clark变换&park变换
    发表于 02-17 15:28 1次下载

    解析汽车抛负载Load Dump:load dump产生原因与TVS并联保护方案

    让我们聊聊Load Dump 在汽车电子,load dump指的是低压电池在充电时与车辆的发电机突然断开连接。由于电池的突然断开,其余被接在发电机总线上的负载会承受非常大的浪涌电压。这个浪涌电压
    的头像 发表于 01-24 10:43 7428次阅读
    解析汽车抛负载Load <b class='flag-5'>Dump</b>:load <b class='flag-5'>dump</b>产生原因与TVS并联保护方案

    自锁电路的调试步骤详解

    自锁电路的调试是确保电路按预期工作的关键步骤。以下是自锁电路调试的详细步骤: 一、准备阶段 检查电路连接 : 仔细检查电路的所有连接点,确保它们连接牢固、无松动。 检查所有导线,确保它们没有破损
    的头像 发表于 01-18 10:16 1236次阅读

    Linux grep命令详解

    Linux grep命令是一种非常常用的文本搜索工具,它可以在给定的文件搜索匹配的字符串,并输出匹配的行。grep是全称“global search regular expression print”,可以识别正则表达式,并使用正则表达式进行搜索。
    的头像 发表于 12-25 09:39 1773次阅读

    干货来喽!实用树莓派Linux编译指南

    通常情况下,模组对接的Linux协议是USB协议,模组通过USB插入Linux设备后可直接使用,系统会检测出设备的标识:PID VID。 然而实际运用,时有新手朋友问:
    的头像 发表于 12-18 16:31 832次阅读
    干货来喽!实用树莓派<b class='flag-5'>Linux</b>编译指南