GDB学习记录

2023-05-16

1、基本用法

在gcc/g++参数里加上 -g ,生成的文件会包含调试程序,不加该参数则不包含调试程序,不利于gdb调试。
基本命令:

list或者l :显示调试对象的代码文本内容。l 文件名:行数 可以显示该文件的第几行
	b:设置断点。例如:b main ,在函数的main处设置断点。b+文件名:行数,在该文件的第几行设置断点。
	i b :查看断点信息,i 的全称是 info。
	r:执行程序命令,会在断点出停下来。输入n或next命令,会继续执行,只执行一行,一行一行执行。
	p 变量名:表示在调试过程中,显示变量的值,p表示print的意思。
	c:表示继续执行,该命令会在下一个断点处停下来。
	p locals:表示显示全部的当地变量值。

基本用法为:启动调试、设置断点、查看变量、继续执行。

2、启动调试

1、启动gdb并传递参数:

方式一:gdb --args 可执行文件名 参数1 参数2 ...
方式二:使用“ gdb 可执行文件名 “启动调试,在程序还没有 r 之前,使用命令:set args 参数1 参数2 ...
方式三:使用“ gdb 可执行文件名 “启动调试,在使用 r 命令的同时加上参数,即:r 参数1 参数2 ...

2、附加到进程:
当你想调试某个程序,然而该程序已经开始运行的时候,我们不用结束该程序,再使用gdb重新运行一次,而是直接在该进程中进行gdb调试。

首先使用命令: ps -aux | grep sec 来查看进程的pid号
方式一:gdb attach <pid>  也即,已经执行的函数程序的pid号,使用命令时不用加<>括号
方式二:gdb --pid <pid>
在使用上述命令进入条时候,会进入程序的等待响应处,你可以在原进程端口输入激励条件,也可以在gdb端口输入。
在推出gdb的时候,使用命令 detach 剥离程序,然后就可以使用 q 退出gdb。

3、单步执行

单步进程调试 n 或者 next ,遇到函数调用会自动跳过函数调用。
单步进程调试 s 或者 step ,遇到自函数会进入子函数。
如果我们不想执行子函数了,使用命令 finish 将会完成当前函数,并返回调用函数的下一行。
退出总结:finish:完成当前子函数,并返回调用函数的下一行
		detach:剥离当前正在运行的函数的调试程序,但剥离后程序还在执行
		q 或者 quit 推出gdb 

4、调试断点管理

b 函数名:在该函数调用处设置断点。
b:设置断点。例如:b main ,在函数的main处设置断点。
b 文件名:行数,在该文件的第几行设置断点。
rb 部分函数名:会在全部满足该条件的函数处添加断点,该“部分函数名”也即使“正则表达式”。
b 你要设置的断点处 if 条件表达式 :这里是条件断点,只有当满足条件的时候,才会中断,适用于循环语句。
tb 你要设置的断点处:表示临时断点,只会执行一次,执行完之后该断点立刻删除。
delete 断点号 : 删除该断点,在使用该命令前,可以使用 i b 命令,查看各个断点信息以及断点号。
disable 断点号:禁用该断点,还可以恢复。
enable 断点号:启用 disable 禁用的断点 

set print array on 设置数组输出格式,为竖
set print pretty 设置结构体输出格式,为竖,也即一个表达式一行。
p 变量名=内容 可以将某一个变量的值更改为你希望的内容。

5、查看与修改内存

格式:x /选项 内存地址
x 内存地址	显示该硬件地址
x /s 内存地址	显示该地址字符串内容
x /4b 内存地址 将该地址以字节方式显示出来,显示其ascii值。

在这里插入图片描述
6、寄存器查看与修改
有的程序没有调试符号,这时候就适用于寄存器来查看,也就是说,在编译时候没有加-g参数的话,你不能使用 命令+变量名的方式来查看修改该变量。

查看寄存器: i register 寄存器名  或者 i r 寄存器名
寄存器名字:rdi rsi rdx rcx r8 r9,分别表所主函数第1、2、3、4、5、6个参数所在的寄存器。
命令 i registers 表示显示通用寄存器
命令 i all-registers 表示显示所有寄存器,包括浮点等寄存器
可以使用命令:set $rip=某地址 来修改函数的执行位置,rip寄存器即为指令取址寄存器pc

总结:使用命令 : info line 行数 来查看某一行的起始地址,然后可以使用命令: set $rip=起始地址来控制程序执行的位置

7、源代码查看与管理
查看源代码

显示源代码:list or l 	#每次默认显示十行
设置每次显示的行数:set listsize 数字
查看指定函数代码:list 函数名
查看指定文件指定行代码:list 文件名:行数
往前显示: l - 
如果类与子类中有相同名字的函数: l 类名::函数名
而如果此时我们不加类名,直接用:l 函数名	#则会将所有重名函数显示出来     

搜索源代码

1、search 正则表达式,例:search test 	#表示查找所有包含"test"的函数
命令:forward-search test	#该命令效果等于 search test 
按下回车键后,会往下查找一个符合的函数,继续按回车,继续查找下一个。
2、如果希望从后向前查找,需要使用命令:reverse-search test
如果我们继续按回车,就会继续从后向前查找
3、我们使用gdb查找函数时候的目录,一个是当前目录,一个是工作目录
使用:show directories 显示工作目录与当前目录
而当你使用了从别处拷贝过来的工程时候,因为你的工作目录与当前目录与之前的可能不一样所以没办法调试,
这个时候我们应该添加搜索目录,命令: directories 路径 	#这个时候,就将项目路径加入,可以进行调试了

8、Core dump分析

对活着的程序进行core dump 分析:
生成core dump 文件,需要对正在运行的程序进行attach,然后使用命令:gcore <core dump文件名> #使用使用没有<>符号。就会生成改进成的coredump文件。
对崩溃的进程分析:
在ununtu 22.04中,coredump文件生成的位置是:/var/lib/apport/coredump
在此之前需要将ulimint -c 设置为:ulimit -c unlimited,然后才能生成coredump文件。
使用命令:cat /proc/sys/kernel/core_pattern 会显示:
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
表示生成coredump文件的是这个目录下的apport文件
使用coredump文件方法:
gdb 进程名字 coredump文件名字

如何分析崩溃的coredump文件

bt 调用堆栈,查看程序在什么地方崩溃了
使用shell命令:最前面加“!”号或者加“shell”。
查看系统栈空间:shell ulimit -a
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB学习记录 的相关文章

随机推荐

  • POJ1456---Supermarket---贪心+小根堆

    POJ1456 Supermarket Time Limit 2000MS Memory Limit 65536K Description A supermarket has a set Prod of products on sale I
  • POJ 2449 Remmarguts‘ Date---SPFA求评估函数 + A*最小堆BFS

    POJ 2449 Remmarguts Date Time Limit 4000MS Memory Limit 65536K Description Good man never makes girls wait or breaks an
  • 根据若依系统+minio实现批量下载附件并自动压缩成zip

    效果实现 分割 以下代码参考于 http t csdn cn 4dUmDwg 话不多说 直接从后端开始 0 首先是pom依赖 lt dependency gt lt groupId gt cn hutool lt groupId gt lt
  • Angular 响应式表单-FormArray 和 FormGroup的多层嵌套

    由于在工作中需要做多层的表单提交校验功能 xff0c 但一直没有好的方法 xff0c 查找了一下网上资料刚好有解决的办法 xff0c 所以借鉴了一下并收藏下来 xff0c 做以后再次使用 有时候 xff0c 在FormArray中 xff0
  • 1、ESP8266入门(AT模式)——调试连接,使用USB-TTL

    1 ESP8266总括 1 1 资料官方下载 乐鑫 xff1a https www espressif com zh hans products hardware esp8266ex overview 安信可 xff1a https www
  • ubuntu返回上一级目录

    返回主目录 cd 返回上一级目录 xff1a cd 43 空格 43
  • week15课上实验csp

    问题A Q 老师的记录册 问题描述 Q 老师有 N 个学生 xff0c 每个学生都有各自独立的编号 xff0c 且编号范围在 1 N 之间 这一天 xff0c 所有学生都在不同的时间进入教室 Q 老师记录了当编号为 i 的学生进入教室时 x
  • VMware虚拟机的OPenwrt旁路由部署记录

    前言 虚拟机网络适配器的模式问题 xff1a 之前建立ubuntu虚拟机时 xff0c 网络模式一般没有改动 xff0c 使用的是NAT模式 xff0c 没出现过问题 这次要让虚拟机作为软路由时 xff0c 一开始也没注意网络模式配置 xf
  • C语言入门系列 -C 语言基础以及基本数据类型

    C语言入门系列 基础以及基本数据类型 第一节 C 语言基础以及基本数据类型 第二节 C 语言运算符 第三节 C 语言控制语句 第四节 C 语言自定义函数 第五节 C 语言修饰变量的关键字 第六节 C 语言构造数据类型 数组 第七节 C 语言
  • 如何解决kali连接网络的问题

    cmd gt services msc 首先 看VMware是不是已经启动如下服务 再者 我们将虚拟机设置被NAT模式 这些都处理完毕后 进入kali 对网络进行配置 命令行设置 终端输入命令vi etc network interface
  • 并查集

    一 什么是并查集 概念 xff1a 并查集由一个整型数组pre 和两个函数find join 构成 数组pre 记录了每个点的前导点是什么 xff0c 函数find x 用于查找 xff0c 函数join x y 用于合并 作用 xff1a
  • xilinx ZCU104安装tensorflow

    xilinx ZCU104安装tensorflow ZCU104芯片是Cortex A53 xff0c 该芯片是ARMv8架构 xff0c 目前满足该平台的tensorflow版本较少 xff0c 我当时在github上找了好长一段时间才找
  • vitis HLS : ERROR: ‘2208201530‘ is an invalid argument. Please specify an integer value.导出IP核失败

    版本 xff1a vitis HLS 2021 2 报错方式 xff1a ERROR 2208201530 is an invalid argument Please specify an integer value while execu
  • 从vivado移植到Xilinx SDK

    Xilinx版本 xff1a 2021 2 PC系统 xff1a Windows10 1 首先准备好一个已完成的工程 xff0c 打开vivado 2 打开该工程 xff0c 导出硬件 xff1a export hardware xff0c
  • vivado 导入IP核并生成bit流文件

    Xilinx版本 xff1a 2021 2 PC系统 xff1a Windows10 前置要求 xff1a 你需要有一个IP核 xff0c 或者自己用vitis HLS生成IP核 1 首先解压IP核 xff1a 然后打开你的vivado软件
  • 3、ESP8266入门(AT模式)——手机与ESP8266通信(AP模式)

    实现手机与ESP8266最简单通信 关于指令参考安信可官方指令 https wiki ai thinker com esp8266 docs at 在AT指令处下载即可 xff0c 还有一个是使用实例 xff0c 也可以具体看看 实验是以这
  • pytorch中的dim=0,=1,=2,在高纬度上的一些个人理解

    编译工具 xff1a Pycharm 张量工具 xff1a pytorch 目前大部分博主对dim的讲解大多停留在低维 xff0c 在这里我说一下高维的情况 xff0c 先看图 xff1a 在上图中 xff0c 我们用pytorch中声明了
  • Makefile 学习笔记

    Makefile 学习笔记 1 hello world b a 64 echo span class token string 34 hello b 34 span a 64 echo span class token string 34
  • Linux Git 学习笔记

    1 版本的创建 xff1a span class token function git span init span class token comment 初始化 span span class token function git sp
  • GDB学习记录

    1 基本用法 在gcc g 43 43 参数里加上 g xff0c 生成的文件会包含调试程序 xff0c 不加该参数则不包含调试程序 xff0c 不利于gdb调试 基本命令 xff1a list或者l xff1a 显示调试对象的代码文本内容