【Linux】Coredump调试

简介: 【Linux】Coredump调试

Coredump 调试

Coredump是什么?

Linux环境下,当程序异常退出(发生段错误)时,会产生一个core文件,该文件记录了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

前期设置

  1. 设置core文件生成的目录,其中%e表示程序文件名,%p表示进程ID,否则会在程序的当前目录生成dore文件。
echo /home/xuanxuan/data/coredump/core.%e.%p >/proc/sys/kernel/core_pattern
  1. 当前执行程序的用户对core目录有写权限且右足够的空间存储core文件。
  2. 生成不受限制的core文件。
ulimit  -c unlimited 

什么情况下会导致程序异常退出?

非法指针的访问,堆栈溢出。

如何调试

  1. 编译的时候添加-g选项,增加调试信息。
  2. gdb program core_file

示例:一个会产生异常退出的程序,非法指针访问。demo.c

#include <stdio.h>
int func(int* p){
    int y = *p;
    return y;
}
int main(void){
    int *p = NULL;
    return func(p);
}
编译,运行,错误已产生。如下图所示。

image-20220712201015128

执行调试命令,结果如下图所示。
gdb demo /home/xuanxuan/data/coredump/core.demo.3102

image-20220712201516630

bt/where命令查看堆栈调用信息

image-20220712202258418

如果要查看某一层的信息,你需要切换当前的栈,一般来说,程序停止时,最顶层的栈就是当前栈,如果你要查看栈下面层的详细信息,首先要做的就是切换当前。
  • frame/f n
frame n
f n
n是一个从0开始的整数,是栈中的层编号,比如:frame 0,表示栈顶,frame 1,表示栈的第二层。

image-20220712203351347

  • up
up n
表示向栈的上面移动n层,不指定n,则为向上移动一层。
  • down
down n
表示向栈的下面移动n层,不指定n,则为向下移动一层。

如若不想打印对应栈层的信息,可以使用如下三个命令。
   select-frame n #对应于 frame 命令
   up-silently n #对应于 up 命令
   down-silently n #对应于 down 命令

  • frame/f

frame/f查看当前栈层信息。

会打印出:

  • 栈的层编号
  • 当前的函数名
  • 函数参数值
  • 函数所在文件及行号
  • 函数执行到的语句
  • info frame/f
可以查看到更详细的当前栈层的信息,只不过,大多数都是运行时的内存地址。比如:函数地址,被调用函数的地址,目前的函数是由什么样的程序语言写的,函数的参数地址及值,局部变量的地址等。如下图所示。

image-20220712205959026

  • info args
打印出当前函数的参数名及其值。
  • info locals
打印出当前函数中所有局部变量及其值。

image-20220712210329495

相关文章
|
7天前
|
缓存 NoSQL Linux
Linux调试
本文介绍了Linux调试、性能分析和追踪的培训资料,涵盖调试、性能分析和追踪的基础知识及常用工具。
148 6
Linux调试
|
3月前
|
NoSQL Linux C语言
Linux GDB 调试
Linux GDB 调试
62 10
|
3月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
|
3月前
|
Ubuntu Linux
内核实验(四):Qemu调试Linux内核,实现NFS挂载
本文介绍了在Qemu虚拟机中配置NFS挂载的过程,包括服务端的NFS服务器安装、配置和启动,客户端的DHCP脚本添加和开机脚本修改,以及在Qemu中挂载NFS、测试连通性和解决挂载失败的方法。
186 0
内核实验(四):Qemu调试Linux内核,实现NFS挂载
|
4月前
|
运维 Java Linux
(九)JVM成神路之性能调优、GC调试、各内存区、Linux参数大全及实用小技巧
本章节主要用于补齐之前GC篇章以及JVM运行时数据区的一些JVM参数,更多的作用也可以看作是JVM的参数列表大全。对于开发者而言,能够控制JVM的部分也就只有启动参数了,同时,对于JVM的性能调优而言,JVM的参数也是基础。
102 8
|
4月前
|
Linux C# iOS开发
如何用 WinDbg 调试Linux上的 .NET程序
【7月更文挑战第13天】 1. `dotnet-dump`: Collects process dumps with `dotnet-dump collect -p &lt;process_id&gt;`. 2. `lldb`: Debugs Mono runtime apps on macOS/Linux. 3. **Visual Studio Code**: Remotely debugs .NET via the C# extension. 4. **JetBrains Rider**: Supports remote debugging of .NET on Linux.
|
3月前
|
网络协议 安全 Linux
在Linux中,如何使用Netcat进行网络调试和端口扫描?
在Linux中,如何使用Netcat进行网络调试和端口扫描?
|
4月前
|
监控 NoSQL Linux
linux常见的coredump原因都有哪些?
Core dump通常发生在程序遇到严重错误时,操作系统会生成core文件来记录程序崩溃时的内存、寄存器状态、栈信息等。
265 3
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
42 1
|
5月前
|
NoSQL Linux C语言
Linux gdb调试的时候没有对应的c调试信息库怎么办?
Linux gdb调试的时候没有对应的c调试信息库怎么办?
31 0