iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux下调试core dump的方式
  • 440
分享到

Linux下调试core dump的方式

2023-06-15 12:06:00 440人浏览 八月长安
摘要

这篇文章主要介绍“linux下调试core dump的方式”,在日常操作中,相信很多人在Linux下调试core dump的方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下调试core dump

这篇文章主要介绍“linux下调试core dump的方式”,在日常操作中,相信很多人在Linux下调试core dump的方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下调试core dump的方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

什么是core dump

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

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

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

打开 core dump 开关:ulimit -c unlimited

看一段有问题的代码:

#include<stdio.h>   int main()  {         int *p=NULL;         *p=0;          printf("bad\n");         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的方式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Linux下调试core dump的方式

本文链接: https://www.lsjlt.com/news/280356.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Linux下调试core dump的方式
    这篇文章主要介绍“Linux下调试core dump的方式”,在日常操作中,相信很多人在Linux下调试core dump的方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux下调试core dump...
    99+
    2023-06-15
  • Linux 中 core dump 文件的作用和使用方法
    Linux 中 core dump 文件 一 、概述1.1 什么是 core dump 文件?1.2 core dump 文件的作用和意义1.3 Linux 中 core dump 文件的保存...
    99+
    2023-09-26
    运维 linux 开发语言 服务器 c语言
  • windows下C++生成Dump调试文件与分析
    目录1、前言2、依赖库下载3、项目配置3.1、设置输出路径3.2、拷贝依赖资源3.3 将dbghelp.h添加在工程中3.4、配置lib文件路径3.5、添加生成minidump文件方...
    99+
    2023-05-15
    C++生成Dump调试文件 windows Dump调试文件 windows Dump文件
  • Linux命令行下调试Python的方法
    这篇文章主要介绍“Linux命令行下调试Python的方法”,在日常操作中,相信很多人在Linux命令行下调试Python的方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux命令行下调试Python...
    99+
    2023-06-02
  • Linux mysql dump配置与调试命令的示例分析
    这篇文章主要为大家展示了“Linux mysql dump配置与调试命令的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux mysql dump配置与调试命令的示例分析”这篇文章...
    99+
    2023-06-16
  • python之linux下pdb试调
    编写一个简单程序用pdb试调一下,代码如下#!/usr/bin/env python # coding: utf-8 __author__ = 'www.py3study.com&#...
    99+
    2023-01-30
    linux python 试调
  • 在Linux 下如何调试 Python
    在Linux 下如何调试 Python,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一般开发者都是在 IDE 中进行程序的调试,当然,有 IDE 的话,当然首选 IDE 进行调...
    99+
    2023-06-02
  • Linux Shell脚本调试模式的方法有哪些
    这篇文章主要介绍“Linux Shell脚本调试模式的方法有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Linux Shell脚本调试模式的方法有哪些”文章能帮助大家解决问题。如何开始写一个脚...
    99+
    2023-06-27
  • Linux下怎么调试python代码
    本篇内容介绍了“Linux下怎么调试python代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Linux下调试pytho代码具体方法日志...
    99+
    2023-06-28
  • Linux下如何调试c语言
    这篇文章主要为大家展示了“Linux下如何调试c语言”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何调试c语言”这篇文章吧。调试是每个程序员都会面临的问题. 如何提高程序员的调试效...
    99+
    2023-06-28
  • Linux下如何调试c++代码
    这篇文章主要为大家展示了“Linux下如何调试c++代码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Linux下如何调试c++代码”这篇文章吧。Linux下调试C++代码具体方法1.编写好代码...
    99+
    2023-06-28
  • React源码调试方式
    目录正文断点调试搜索定位Chrome Devtools 调试sourcemapnpm 下载react包插件注释调试 React 最初源码关联 react 源码项目总结正文 什么?调试...
    99+
    2022-11-13
    React 源码调试 React调试
  • Python调试的方式有哪些
    本篇内容主要讲解“Python调试的方式有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python调试的方式有哪些”吧!Print对于脚本语言,调试最简单的方式就是打印输出,而print函...
    99+
    2023-06-15
  • MySQL UDF的调试方式 - debugview (转)
    MySQL UDF的调试方式 - debugview (转)[@more@]Mysql UDF的调试方式 MYSQL的UDF实质就是一个不需要设置入口点的动态连接库(*Nix称之为共享库)。对于DLL的调试...
    99+
    2024-04-02
  • Linux dump命令的使用方法
    Linux  dump命令的使用方法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Linux常用命令e2fsck命令用于检查使用 Linux ext2 档案系统的...
    99+
    2023-06-28
  • 怎么调试React源码?多种工具下的调试方法介绍
    怎么调试React源码?下面本篇文章带大家聊聊多种工具下的调试React源码的方法,介绍一下在贡献者、create-react-app、vite项目中如何debugger React的真实源码,希望对大家有所帮助!clone React将R...
    99+
    2023-10-22
    React.js Visual Studio Code WebStorm
  • 调试Node.js代码的方式有哪些
    这篇文章主要讲解了“调试Node.js代码的方式有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“调试Node.js代码的方式有哪些”吧!很多时候,我苦恼于 Node.js 的调试,只会使...
    99+
    2023-06-21
  • C++ 内存泄漏调试方式
    C++和其他高级语言不同,需要自行管理内存,项目大\调用多,容易内存泄漏.内存申请释放使用malloc/free和new delete两种方式. 当内存报错弹出一个陌生的地址,我一脸...
    99+
    2024-04-02
  • VSCode 启动 Node.js 调试的几种方式
    在VSCode中,可以通过以下几种方式启动Node.js调试:1. 使用`launch.json`配置文件启动调试:通过在VSCod...
    99+
    2023-09-20
    VSCode
  • Linux系统下常用的调试工具有哪些
    本文将为大家详细介绍“Linux系统下常用的调试工具有哪些”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“Linux系统下常用的调试工具有哪些”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下...
    99+
    2023-06-28
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作