首页 > 其他分享 >gdb查coredump问题流水账

gdb查coredump问题流水账

时间:2024-01-21 12:22:19浏览次数:31  
标签:流水账 info 打印 coredump gdb 断点 调试

 

1,前言

如果c++发生了coredump,该怎么办。写c++项目很是头疼的是碰到c++的coredump,程序终止的时候留的信息很有限,不知道怎么查找问题。

 

 

2,GDB介绍

一直想了解GDB是怎么使用的却没怎么深入了解,只是简单熟悉了gdb的简单使用命令,比如辅助来打断点,熟悉代码调用栈的作用。

(1),gdb启动调试

如果需要调试可执行文件,gdb exefilename.out 进入调试模式来跑,静态方式。

如果需要对某个正在运行中的进程进行调试,则 gdb -p pid,或者 gdb attach pid 的方式

 

(2),gdb设置断点

break(b) linenum 是 针对当前文件的第几行进行断点,如果多个文件要到其他文件下断点,使用 b filename:linenum 则是到指定文件名下断点

break(b) function;     break(b) class::function;    break(b) class::function(type, type)  都是在函数入口进行断点

info b 可以查看当前所有标记了的断点

delete bnumber  可以删除指定的断点,其中bnumber是断点号,delete则是删掉所有的断点

disable/enable bnumber 可以禁用/启用指定的断点

 

(3),gdb打印

p variable 打印当前的变量,区分不同的格式 p /x a 是按照十六进制的方式来输出a变量; p /d a 是按照十进制的方式来输出a变量

在打印数组时,可以设置打印数组的个数 set print elements 0 (不限制打印数量)

选择打印数组的范围   print *(arr + start_index)@num 是打印数组arr从第start index起的num个数组元素的内容

x address 打印地址内容,x/nfu address,其中n是输出单元个数,f输出格式(如x是16进制,类似print格式),u是表明一个单元的长度(如b是一个byte,h是两个byte,w是四个byte,g是八个byte)

举个例子的是 x /16xb arr 的方式是在arr地址开始以16进制打印16个字节

 

(4),gdb调试命令

backtrace(bt) 显示当前执行的堆栈信息, bt full 加个full则显示所有参数信息

step(s) 调入下一步的单步调试命令,有函数会进入函数调用

next(n) 单步跟踪,有函数则不会进入函数调用

frame(f) n 是切换当前的栈帧,n是对应的bt里面的栈帧的序号

info(i) frame 打印当前的栈帧信息

info(i) locals 打印当前栈帧的局部变量

info registers 打印寄存器信息(除了浮点数寄存器)  info all-registers 打印所有寄存器信息 

info threads 打印当前正在运行的线程信息

watch expression ,可以是整型变量,也可以是指针变量, 

info watch 则可以查看所有的观察点

list 则可以展示源代码,disassemble func 查看函数执行的汇编码

 

 

3,gdb调试coredump步骤

(1),如果程序coredump没有产生coredump文件,需要设置系统设置的core dump文件大小,命令:ulimit -c number 

 

(2),对生成的coredump文件,用gdb进去,命令: gdb coredump exefile.out

 

(3),查看当前的栈信息,info locals 可以打印所有的局部变量的信息

可以发现一个AClass类的局部变量, 怀疑是内存写坏了的问题,打印该类的指针: p AClassPoint  输出该类的地址为 0xff1234

然后 x /16xg 0xff1234 可以看看该类的内存信息

因为 AClass 是一个虚类,发现打印的首地址是 0x0000b ,显然该地址不是一个正确的指向虚函数的虚表地址

那么,可以推断为该类的内存地址被写坏 

 

(4),分析内存地址被写坏的可能性

典型的错误有 悬空指针裸写,数组越界写坏,被free后使用,等等情况

 

标签:流水账,info,打印,coredump,gdb,断点,调试
From: https://www.cnblogs.com/zhang-yd/p/17977702

相关文章

  • 记录迁移mongdb数据库
    在Windows系统上,默认情况下,MongoDB的数据库文件存储在以下位置: C:\ProgramFiles\MongoDB\Server\<版本号>\data\db这是MongoDB安装程序的默认路径。<版本号> 是MongoDB的版本号,例如 4.4 或 5.0。请注意,如果你在安装MongoDB时选择了不同的安装路径,那么数据库......
  • GDB调试之查看变量类型信息(十三)
    查看变量类型信息常用命令:whatisptype/r/o/m/tivariablessetprintobjecton调试代码下载地址whatis命令的使用:ptype命令的使用:查找指定变量在什么地方:......
  • GDB调试之多窗口管理 (十二)
    多窗口管理常用命令:layoutsrc:显示源码窗口layoutasm:显示汇编窗口layoutreg:显示寄存器窗口layoutsplit:切分窗口focussrc/asm/reg:切换窗口焦点infowin:查看当前拥有焦点的窗口ctrl+x+a:退出窗口模式显示源码窗口:多窗口管理调试代码:查看当前拥有焦点的窗口:切换窗......
  • GDB调试之为断点执行命令(十一)
    调试代码下载地址断点执行命令commands的使用:为指定断点设置断点执行命令:保存和导入断点的设置信息: ......
  • GDB调试之捕获点的使用(十)
    一、什么是捕获点捕获点是一个特殊的断点,命令语法为:catchevent,即捕获到event这个事件的时候,程序就会中断下来。测试代码示例如下:#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<iostream>#include<cstring>#include<th......
  • GDB调试之观察点的使用(九)
    一、什么是观察点?观察点是一个特殊的断点,当表达式的值发生变化时,它将中断下来。表达式可以是一个变量的值,也可以包含由运算符组合的一个或多个变量的值,例如'a+b'。有时被称为数据断点(VC里面就称之为数据断点)。二、观察点常用命令watch:写观察点rwatch:读观察点awtach:读写断......
  • GDB调试之函数调用栈管理(八)
    栈帧:当程序进行函数调用的时候,比如说在哪里调用,这些信息我们称之为栈帧。每一个栈帧的内容包括调用的参数,局部变量,寄存器等这些信息,这就是一个栈帧。调用栈:所有栈帧组成的信息称之为调用栈,或者我们也可以称之为调用堆栈。栈的特性是后进先出,函数调用也是这样,如果函数1里面调用了......
  • GDB调试程序 [补档-2023-07-19]
    gdb调试​它是gcc的调试工具,调试工具都能干什么就不多说了。7-1生成调试信息​在使用gcc编译c/c++的程序时,需要在编译命令中加入-g这一参数,它可以为你显示函数名,变量名等待。例如:gcc-gtest.c-otest​7-2启动gdb调试信息​启动指令:gdb可执行程序......
  • GDB调试之源代码查看与管理(六)
    一、源代码管理命令显示源代码:listorl,默认显示10行(在当前行往后5行,以及往前5行,总共10行代码)设置每次显示的行数:setlistsizexx查看指定函数代码:listtest_fun查看指定文件指定行代码:listmain.cpp:15显示源代码:查看指定函数代码:查看指定文件指定行代码:设置每次......
  • GDB调试之寄存器查看与修改(六)
    一、寄存器查看命令命令:"iregister"查看所有的寄存器,如果只想查看指定的寄存器,则使用"ir寄存器名称",如"irrdi",寄存器的名称列表如下所示:函数参数低于六个的时候,会把参数放在寄存器中,当函数参数高于六个参数的时候,就不会把参数放在寄存器中,而是放在函数栈中。调试代码如下......