linux—常用gdb调试命令汇总

2023-05-16

目录

一.准备工作

二.调试命令

(一).查看代码内容(l)

 (二).开始调试(r)

(三).查看当前调试位置(where)

(四).断点(b、info b、d、c、disable、enable)

1.打断点

2.显示断点

 3.删除断点

4.调试至下一个断点

5.关闭断点

​编辑 6.打开断点

(五).打印变量和数组(p、display、undisplay)

1.打印某变量值

 2.常显示某变量

3.删除常显示

 (六).逐语句、逐过程调试(s、n)

1.逐语句调试(step)

2.逐过程调试(next)

 (七).函数(bt、finish、until)

1.查看当前堆栈调用

2.直接跑完当前函数

3.执行至指定行

(八).反汇编(disassemble)

 (九).在gdb界面执行linux指令(shell)

(十).退出gdb(quit)


一.准备工作

首先,我们需要将文件编译为debug版本。因为在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本。

我们需要在gcc或g++命令后加上限定符-g。这样生成的程序就是debug版本的。

方式如下:

gcc/g++ -g test.c/test.cpp -o test

二.调试命令

*gdp会自动记录最近的命令,如果没有输入其他命令,可以按enter键继续执行最近命令。

(一).查看代码内容(l)

l  命令是用来查看代码内容的。使用方式为

l 行号        默认生成10行,当指定行号时,会生成以指定行号为中间的共10行代码

默认不指定行号时: 

(gdb) l
1	#include<iomanip>
2	#include<stdio.h>
3	#include<string.h>
4	#include<iostream>
5	#include<stdlib.h>
6	#include<unistd.h>
7	using namespace std;
8	int main()
9	{
10	  char arr[102] = { 0  };
(gdb) 

 指定行号:

(gdb) l 10
5	#include<stdlib.h>
6	#include<unistd.h>
7	using namespace std;
8	int main()
9	{
10	  char arr[102] = { 0  };#会以第10行为中心
11	  const char* Lop = "|/-\\";
12	  memset(arr, 0, sizeof(arr));
13	  int i = 0;
14	  for(i = 0; i <= 100; i++)
(gdb) 

 (二).开始调试(r)

r命令用来开始代码调试工作,使用方式如下:

r        开始调试,直到程序结束或遇到断点暂停。在调试过程中,再次使用r命令会重新开始调试。

 

(三).查看当前调试位置(where)

where        查看此时执行位置

 

(四).断点(b、info b、d、c、disable、enable)

1.打断点

b 行号        在指定行打断点

2.显示断点

info b        显示全部断点信息,也可以在b后加编号显示指定断点

(gdb) b 10  #打断点
Breakpoint 3 at 0x400ac8: file cdl.cpp, line 10.
(gdb) b 15
Breakpoint 4 at 0x400b23: file cdl.cpp, line 15.
(gdb) info b  #显示断点
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:10
4       breakpoint     keep y   0x0000000000400b23 in main() at cdl.cpp:15
(gdb) 

 3.删除断点

d 断点编号        删除指定断点,不加编号则删除全部

注意断点编号不是行号,可以使用info来查看。 

(gdb) info b
Num     Type           Disp Enb Address            What
5       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:7
6       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:10
7       breakpoint     keep y   0x0000000000400b23 in main() at cdl.cpp:15
8       breakpoint     keep y   0x0000000000400b39 in main() at cdl.cpp:17
(gdb) d 5   #删除指定断点
(gdb) d     #删除全部断点
Delete all breakpoints? (y or n) y
(gdb) info b
No breakpoints or watchpoints.
(gdb)

4.调试至下一个断点

c        从当前调试位置直接执行到下一个断点处

#断点为10、17、18行
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:10
2       breakpoint     keep y   0x0000000000400b39 in main() at cdl.cpp:17
3       breakpoint     keep y   0x0000000000400c04 in main() at cdl.cpp:20
(gdb) r  #执行到第10行暂停

Breakpoint 1, main () at cdl.cpp:10
10	  char arr[102] = { 0  };
(gdb) c   #执行到第17行暂停
Continuing.

Breakpoint 3, main () at cdl.cpp:17
17	    cout << '[' << setw(100) << arr << ']' << '[' << i << '%' << ']' << Lop[i % 4] << '\r';
(gdb)

5.关闭断点

disable 断点编号        关闭断点 

注意,关闭断点并不是删除断点。只是在调试时不会在该处暂停,但是断点依旧存在。 

使用info b即可看断点关闭与否。

 6.打开断点

enable 变量编号        打开断点

同样的,指令需要输入的也是断点编号

 

(五).打印变量和数组(p、display、undisplay)

1.打印某变量值

p 变量        打印对应的变量值,打印地址直接加取地址符&即可

需要注意的是,这种方法只能显示一次变量值,当继续调试时变量不再显示。

(gdb) p i
$5 = 4
(gdb) n
14	  for(i = 0; i <= 100; i++)
(gdb)     #变量i没有再次显示

如果我们需要打印数组的值,输入数组名即可。

 2.常显示某变量

如果我们需要在调试中一直显示某个变量的值,那么就需要display命令了。

display 变量        常显示指定变量值,使用方式与p一致 

(gdb) display arr
3: arr = "---------", '\000' <repeats 92 times>
(gdb) c
Continuing.
[---------                                                                 ][9%]/
Breakpoint 1, main () at cdl.cpp:17
#arr数组常显示
3: arr = "----------", '\000' <repeats 91 times>
(gdb) 

3.删除常显示

undisplay 常显示变量编号        删除指定常显示变量 

 需要注意的是,不能直接写变量名,变量编号使用info display即可知道。

 

 (六).逐语句、逐过程调试(s、n)

1.逐语句调试(step)

s        逐语句调试。相当于vs中的F11

2.逐过程调试(next)

n        逐过程调试。相当于vs中的F10 

 

 (七).函数(bt、finish、until)

1.查看当前堆栈调用

bt        查看当前堆栈调用 

主要用于调试至函数内部或者递归调用函数时。 

 我们以一个递归程序举例:

#include<stdio.h>
void func(int i);
void func(int i)
{
  if(i == 0)  return;
  printf("hello world\n");
  func(i - 1);
}

int main()                                                                                                      
  3 {                                                                                                                                              
  4   func(3);                                                                                                                                       
  5   return 0;                                                                                                      
  6 }           

当我们执行至i == 1时: 

2.直接跑完当前函数

finish        可以直接跑完当前函数,若函数只有一层则直接跑完函数。 

如果是函数递归调用,当还没开始递归时,finish会执行完整个函数,自动走完全部递归过程(前提无断点)。

当已经递归调用后,在哪一层递归finish就会返回至它的前一层。 

我们依旧以上一个递归程序为例: 

3.执行至指定行

until 行号        执行至指定行

1	#include"head.h"
2	 void func(int i)
3	{
4	  if(i == 0)  return;
5	  printf("hello world\n");
6	  func(i-1);
7	}
(gdb) until 5
func (i=3) at function.c:5
5	  printf("hello world\n");
1: i = 3
(gdb) 

until也可以在main函数中使用,但一般until用于小范围跳动。

 

(八).反汇编(disassemble)

disassemble        查看指令附近区域的反汇编

 

 

 (九).在gdb界面执行linux指令(shell)

shell 指令        在gdb界面中执行linux指令

 

(十).退出gdb(quit)

(gdb) quit

(gdb) quit
A debugging session is active.

	Inferior 1 [process 10341] will be killed.

Quit anyway? (y or n) y
[cdl@VM-16-9-centos ~]$ 

 

  • “一名优秀的程序员,在穿越单行道时也会确认双向的来车情况。”——道格拉斯·林德(Doug Linder)

 如有错误,敬请斧正

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux—常用gdb调试命令汇总 的相关文章

  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • 使用 Python 将阿拉伯语或任何从右到左书写系统的字符串打印到 Linux 终端

    非常简单的例子是 city print city 我期望输出是 但实际上输出是相反的字符串 字母看起来有点不同 因为它们有开始 中间和结束形式 我无法将其粘贴到此处 因为复制粘贴会再次更正字符串的顺序 如何在 Linux 终端上正确打印阿拉
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 使用 gdb 调试 qemu

    如何使用 gdb 调试 qemu 我一直在谷歌搜索但找不到任何具体的东西 我在 GDB 7 5 中遇到错误 gt 访问内存地址时出错 似乎 位置独立可执行文件 有问题 所以使用 configure enable debug disable
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 如何从 Linux 命令行确定 LCD 显示器是否打开

    如何通过 Linux 命令行判断计算机的显示器是否打开 关闭 我传统上认为显示器是仅输出的设备 但我注意到 Gnome 显示器首选项对话框具有 检测显示器 功能 这可以推广到确定显示器是否物理关闭吗 VESA DDC 连接是I2C http
  • 我们可以在 Bash 脚本中使用 PHP 吗?

    我有一个 bash 脚本abcd sh bin sh for i in seq 8 do ssh w i uptime ps elf grep httpd wc l free m mpstat done pid sleep 1 kill 9
  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • 如果目录不存在,有没有办法让 mv 创建要移动到的目录?

    因此 如果我在主目录中并且想将 foo c 移动到 bar baz foo c 但这些目录不存在 是否有某种方法可以自动创建这些目录 以便你只需要输入 mv foo c bar baz 一切都会顺利吗 似乎您可以将 mv 别名为一个简单的
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • 为什么 RHEL 上的 bash 中 `read -t` 没有超时?

    Why read t在 RHEL5 或 RHEL6 上从管道读取时不会超时 这是我的示例 在从管道读取数据时 我的 RHEL 盒子不会超时 tail f logfile log grep something read t 3 variabl
  • 如何在 Linux 中显示进程状态(阻塞、非阻塞)

    有没有办法查询 Linux 进程表中进程的状态 以便能够演示执行查询时进程是正在运行还是被阻止 我的目标是从进程或程序的 外部 执行此操作 因为我希望从操作系统进程的角度来理解这一点 但欢迎任何想法 这是Python代码阻塞的过程 impo
  • 我如何知道用户在使用 ncurses (Linux) 的控制台中按下了 ESC 键?

    I have a problem in detecting whether I just got a plain ESC key just code 27 or whether it was another special key such

随机推荐

  • 第一个SpringBoot项目的创建

    目录 一 SpringBoot是什么 xff1f 初识springboot springboot的优点 二 SpringBoot项目的创建与简单运行 x1f351 使用idea创建springboot项目 x1f351 Spring Boo
  • 解决在vue3中使用reactive响应式,赋值后造成页面不改变的问题?

    文章目录 场景原因一 例子二 解决方法1 使用ref存储响应式数据2 在reactive中使用对象包裹要改变的数据3 for of循环push到reactive数据中 xff0c 不破坏数据结构 总结 场景原因 我们需要在vue3中使用服务
  • ubuntu交叉编译工具arm-linux-gcc安装

    1 安装交叉编译工具 xff1a arm linux gcc 安装包4 4 6 TQ210 release 20120720 tar bz2 环境 xff1a ubuntu 20 版 xff0c 已换清华源 1 1解压文件 提取解压1 1
  • MYSQL(1)----初阶

    一 新增 insert into 表名 values 列的值 xff0c 列的值 xff0c 列的值 xff0c 列的值 insert into 表名 字段1 xff0c 字段2 values 列的值 xff0c 列的值 列的值 xff0c
  • GitLab -- 创建新用户

    登录GitLab xff0c 点击最上面的扳手图标 xff0c 进入 管理区域 页面 xff0c 点击 新建用户 进入新建用户页面 xff0c 输入对应信息 信息确认后 xff0c 点击 创建用户 用户创建成功后 xff0c 点击 编辑 按
  • debian技能大赛 笔记 (一)静态IP 网卡重启

    一 Debian静态IP 1 使用vim打开 etc network interfaces配置文件 vim etc network interfaces 2 在配置文件里添加 auto 网卡号 allow hotplug 网卡号 iface
  • Debian技能大赛笔记(二)service 、systemctl等命令消失不见解决办法

    二 service systemctl等命令消失不见解决办法 1 使用命令进入root模式 wt 64 Rserver su root Password root 64 Rserver home wt 2 使用vim 使用vi或者nano都
  • debian技能大赛笔记(八)创建DISK RAID5 自动挂载

    一 问题 1 在虚拟机上添加四个1g的硬盘 2 创建raid5 其中一个作为热备盘 设备名为 md0 3 将md0设置为LVM 设备名为md0 4 格式化为ext4 文件系统 5 开机自动挂载到 data目录 添加硬盘 添加完几个硬盘虚拟机
  • Debian大赛笔记(十)修改系统语言

    1 在root用户下输入 dpkg reconfigure locales 选择ZH CN xff08 简体中文 xff09 按空格键选择 xff0c 选择成功后重启系统语言便会修改成功
  • Debian技能大赛笔记(11)欢迎信息内容配置 删除欢迎信息

    技能大赛里都有一个差不多的题就是做一个欢迎信息 大致就像下图 那怎么配置呢 1 进入配置文件 vim etc update motd d 10 uname 在配置文件里加入 uname snrvm printf n printf 2s Ch
  • 上班摸鱼看小说的最佳软件

    这个软件几乎满足了我对上班摸鱼的所有担忧 xff0c 比如上班的时候打开网页看下说 xff0c 那太明显了 xff0c 不说摄像头 xff0c 后台看一下浏览器历史记录就暴露的特别明显 xff0c 这合适吗 xff1f 老板来到你身后远远的
  • iOS-UI-导航控制器-导航栏

    文章目录 导航控制器导航控制器的基本创建方法导航控制器的基本框架如下图所示添加单个按钮 x1f518 添加多个按钮 x1f518 创建按钮数组导航控制器效果 导航控制器的切换VcRoot界面切换事件函数 导航控制器 导航控制器 xff1a
  • 【iOS开发】-UIViewController加载过程和生命周期

    文章目录 前言ViewController执行过程的探讨ViewControllerOne 函数介绍顺序引入ViewControllerSecond引入 ViewControllerOne点击执行到ViewControllerSecond的
  • 【C语言】魔方阵的实现(最全)

    魔方阵的实现 xff08 最全 xff09 一 什么是魔方阵 xff1f 魔方矩阵 xff0c 又称幻方 xff0c 是具有相同的行数和列数 xff0c 并在每行每列 对角线上的和都相等的矩阵 N阶幻方 xff0c 即将自然数1到排成N行N
  • 四种求最大公约数的算法 C / C++

    文章目录 前言一 辗转相除法1 算法简介2 算法描述3 代码及复杂度 二 穷举法 xff08 枚举法 xff09 1 算法简介2 算法描述3 代码及复杂度 三 更相减损法1 算法简介2 算法描述3 代码及复杂度 四 Stein算法 xff0
  • 安装使用supervisor来启动服务

    supervisor 使用方法 supervisor 官网 是一个unix的系统进程管理软件 xff0c 可以用它来管理apache nginx等服务 xff0c 若服务挂了可以让它们自动重启 当然也可以用来实现golang的守护进程 学完
  • 超详细讲解实现拓扑排序、关键路径

    今天 xff0c 小编带着大家来学习图中非常重要的一环 xff0c 拓扑排序和关键路径 xff01 目录 一 绪论 实际应用 二 拓扑排序 xff08 一 xff09 含义 xff08 二 xff09 实现原理 xff08 三 xff09
  • getline函数介绍

    今天 xff0c 小编将为大家讲解有关getline函数的相关知识 目录 一 cin getline char s streamsize n char delim 二 getline istream amp is string amp st
  • C++语法——详解运算符重载

    运算符重载是C 43 43 的一个重要特性 有了运算符重载 xff0c 在代码编写时能更好的实现封装 目录 一 运算符重载介绍 二 运算符重载形式 xff08 一 xff09 参数 xff08 二 xff09 返回值 xff08 三 xff
  • linux—常用gdb调试命令汇总

    目录 一 准备工作 二 调试命令 xff08 一 xff09 查看代码内容 xff08 l xff08 二 xff09 开始调试 xff08 r xff09 xff08 三 xff09 查看当前调试位置 xff08 where xff09