GDB调试工具命令速查

2023-10-26

1.生成调试信息

一般来说GDB主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,我们必须要把调试信息加到可执行文件中。
使用编译(gcc/g++)的 -g 参数可以做到这一点

$ gcc -g test.c
$ g++ -g test.cpp

如果没有-g,你将看不见程序的函数名、变量名,所代替的全是运行时的内存地址。

2.启动GDB

  • 启动gdb

    $ gdb program

    (program 也就是你的执行文件,一般在当前目录下)

  • 设置运行参数

    (gdb) set args
    (gdb) set args 10 20 30 “hello world” 6.66

可指定运行时参数。(如:set args 10 20 30 40 50 )

(gdb) show args

(命令可以查看设置好的运行参数)

  • 启动程序

    (gdb) run

(程序开始执行,如果有断点,停在第一个断点处)

(gdb) start

(程序向下执行一行)

3.显示源代码

用list命令来打印程序的源代码。默认打印10行。

  • 打印第linenm行的上下文内容

    (gdb) list linenum

  • 显示函数名为function的函数的源程序

    (gdb) list function

  • 显示当前行后面的源程序

    (gdb) list

  • 显示当前行前面的源程序

    (gdb) list -

  • 设置一次显示源代码的行数

    (gdb) set listsize count

  • 查看当前listsize的设置

    (gdb) show listsize

4.断点操作

  1. 简单断点
    break 设置断点,可以简写为b

    (gdb) b 6
    (gdb) break 6

    (设置断点,在源程序第10行)

    (gdb) b func

    (设置断点,在func函数入口处)

2.多文件设置断点
C++中可以使用class::function或function(type,type)格式来指定函数名。
如果有名称空间,可以使用namespace::class::function或者function(type,type)格式来指定函数名。
Ø break filename:linenum – 在源文件filename的linenum行处停住
Ø break filename:function – 在源文件filename的function函数的入口处停住
Ø break class::function或function(type,type) – 在类class的function函数的入口处停住
Ø break namespace::class::function – 在名称空间为namespace的类class的function函数的入口处停住
3.查询所有断点

info break
info b
i break
i b

(上面所有都等同)

5.条件判断

一般来说,为断点设置一个条件,我们使用if关键词,后面跟其断点条件。
设置一个条件断点:

b test.c:8 if Value == 5

6.维护断点

1)delete [range…] 删除指定的断点,其简写命令为d。
如果不指定断点号,则表示删除所有的断点。range表示断点号的范围(如:3-7)。
比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。
2) disable [range…] 使指定断点无效,简写命令是dis。
如果什么都不指定,表示disable所有的停止点。
3) enable [range…] 使无效断点生效,简写命令是ena。
如果什么都不指定,表示enable所有的停止点。

7.调试代码

  • run 运行程序,可简写为r
  • next 单步跟踪,函数调用当作一条简单语句执行,可简写为n
  • step 单步跟踪,函数调进入被调用函数体内,可简写为s
  • finish 退出进入的函数
  • until 在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体,可简写为u。
  • continue 继续运行程序,停在下一个断点的位置,可简写为c
  • quit 退出gdb,可简写为q

8.数据查看

查看运行时数据
print 打印变量、字符串、表达式等的值,可简写为p

(gdb) p count

(打印count的值)

9.自动显示

你可以设置一些自动显示的变量,当程序停住时,或是在你单步跟踪时,这些变量会自动显示。相关的GDB命令是display。

  • display 变量名
  • info display – 查看display设置的自动显示的信息。
  • undisplay num(info display时显示的编号)
  • delete display dnums… – 删除自动显示,dnums意为所设置好了的自动显式的编号。如果要同时删除几个,编号可以用空格分隔,如果要删除一个范围内的编号,可以用减号表示(如:2-5)
  • disable display dnums…
  • enable display dnums…
  • disable和enalbe不删除自动显示的设置,而只是让其失效和恢复。

10.查看修改变量的值

(gdb) ptype width – 查看变量width的类型
type = double

(gdb) p width – 打印变量width 的值
$4 = 13

你可以使用set var命令来告诉GDB,width不是你GDB的参数,而是程序的变量名,如:

set var width=47

(将变量var值设置为47)

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

GDB调试工具命令速查 的相关文章

  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • 如何构建任务“gems:install”

    我正在将 Rails 应用程序部署到 Linux 服务器 并且缺少一些 rake 任务 包括 rake gems install 和 rake db 我正在运行来自 GEM 的 Rails 2 3 4 为什么是这样 我该如何解决 我可以以某
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • 为什么C Clock()返回0

    我有这样的事情 clock t start end start clock something else end clock printf nClock cycles are d d n start end 我总是得到输出 时钟周期是 0
  • GDB - 将地址映射到源代码中的行和列

    gcc 和 clang 都有选项 gcolumn info 描述如下 将位置列信息发出到 DWARF 调试信息中 而不仅仅是文件和行 我已经使用此选项编译了我的二进制文件 现在我有一些指令的地址 想将其翻译回源文件 行号和列 有没有办法在g
  • 无法在 Perl 中找到 DBI.pm 模块

    我使用的是 CentOS 并且已经安装了 Perl 5 20 并且默认情况下存在 Perl 5 10 我正在使用 Perl 5 20 版本来执行 Perl 代码 我尝试使用 DBI 模块并收到此错误 root localhost perl
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 警告:请求的映像平台 (linux/amd64) 与检测到的主机平台 (linux/arm64/v8) 不匹配

    警告 请求的映像平台 linux amd64 与检测到的主机平台 linux arm64 v8 不匹配 并且未请求特定平台 docker 来自守护程序的错误响应 无法选择具有功能的设备驱动程序 gpu 我在 mac 上尝试运行此命令时遇到此
  • 限制 Imagemagick 使用的空间和内存

    我在 Rails 应用程序上使用 Imagemagick 使用 rmagick 但我的服务器 Ubuntu 不是很大 当我启动转换进程时 Imagemagick 占据了我的服务器 30GB HDD 的所有位置 内存 我想限制内存和 tmp
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有
  • linux命令中括号的用途是什么[重复]

    这个问题在这里已经有答案了 我在 Linux 终端中运行以下命令 谁能告诉我 Linux 终端中括号和以下命令的用途是什么 echo GET HTTP 1 0 echo 主机 www google com echo 数控 www googl
  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • 如何将后台作业的输出分配给 bash 变量?

    我想在 bash 中运行后台作业并将其结果分配给一个变量 我不喜欢使用临时文件 并且希望同时运行多个类似的后台任务 root root var echo hello world root root echo var hello world
  • 如何访问 mmaped /dev/mem 而不导致 Linux 内核崩溃?

    我有一个简单的程序 尝试访问用户空间中的物理内存 其中内核存储第一个结构页 在 64 位机器上 该地址是 内核虚拟地址 ffffea0000000000 物理地址 0000620000000000 我正在尝试通过用户空间中的 mmap 访问
  • C - 为什么我无法映射较小(256UL 或更小)的内存?

    请告诉我 为什么我的简单应用程序无法映射较小的内存 而且 为什么有这样一个特定的边界 257UL define MAP SIZE 256UL or below fail define MAP SIZE 257UL ok include
  • dlopen 或 dlclose 未调用信号处理程序

    我在随机时间内收到分段错误 我注册了信号 但发生分段错误时未调用信号处理程序 include
  • Linux“屏幕”的 Windows 等效项还是其他替代方案?

    我正在寻找一种在 Windows 环境中控制程序的方法 我希望它与 Linux 软件有点相似 screen 我搜索的原因是我需要使用标识符启动一个程序 在 Windows 上 这样我以后就能够关闭该特定程序 而无需关闭其他任何程序 即使实际
  • 在 debian wheezy amd64 上安装 ia32-libs

    我正在使用 Debian 7 喘息 amd64 uname a Linux tzwm debian 3 2 0 4 amd64 1 SMP Debian 3 2 51 1 x86 64 GNU Linux 我想安装ia32 libs在我的
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t

随机推荐

  • DDD(领域驱动设计)系列主题:聚合和聚合根

    本篇文章主要介绍了聚合根 聚合的概念 然后介绍了聚合的设计过程和原则 以及对比了聚合 聚合根 实体 值对象的特点 思考的问题 为什么要在限界上下文和实体之间增加聚合和聚合根的概念 它们的作用是什么 如何设计聚合 概念和职责 聚合根 如果把聚
  • 2020年数学建模国赛A题:炉温曲线

    2020年高教社杯全国大学生数学建模竞赛题目 请先阅读 全国大学生数学建模竞赛论文格式规范 A题 炉温曲线 在集成电路板等电子产品生产中 需要将安装有各种电子元件的印刷电路板放置在回焊炉中 通过加热 将电子元件自动焊接到电路板上 在这个生产
  • 虚拟机的快捷键

    ctrl alt 鼠标就出来了 ctrl c 中断当前操作
  • 谷粒商城--从入门到入坟(持续更新)第一篇:总体概括

    简介 谷粒商城项目 是尚硅谷的一套基于微服务的电商视频 在网上大受欢迎 本人系大三老狗 准备用大约一个月时间 去拆解该商品的知识点 由点及面 最后希望呈现一个比较好的效果 每个知识点 配套的安装软件及源码也会发布出来 希望有伙伴能一起进步
  • 自定义控件.DateTimePicker_02

    ZC 踩坑过程在 后面 1 在 Generic xaml 中添加内容
  • Unknown system variable 'query_cache_size' 问题终于解决了,原来是这样!

    遇到这种问题搞了半天终于解决 原因 mysql connecter java的版本过低 很显然是数据库驱动程序与数据库版本不对应 查看了一下配置 发现mysql connector java的版本是5 1 37 而我本地mysql版本是8
  • Mysql中explain执行计划信息中字段详解

    Mysql中explain执行计划信息中字段详解 1 获取执行计划 2 字段含义 2 1 id 2 2 select type 2 3 table 2 4 partitions 2 5 type 2 6 possible keys 2 7
  • qt 信号与槽的用法和定义

    转自 http blog csdn net kaffeel article details 5568954 信号和槽是Qt编程的一个重要部分 这个机制可以在对象之间彼此并不了解的情况下将它们的行为联系起来 在前几个例子中 我们已经连接了信号
  • 通过OKhttp3 访问 https地址

    okHttp3添加信任所有证书 return public static OkHttpClient getUnsafeOkHttpClient try final TrustManager trustAllCerts new TrustMa
  • [分布式]可伸缩性最佳实践

    下面是我们认为的一些可伸缩性的最佳实践 异步 尽可能的使用异步 同步调用会导致两个服务的可用性绑在一起 意味着一个服务出问题或变慢 另一个也会受到影响 这点也是eBay一直强调的 泳道设计 错误隔离机制 避免一个失败影响全局 这种机制也有助
  • Pytorch遇到的问题及解决方案 - 更新ing

    1 安装完成后 不能import torch 提示 ImportError dlopen cannot load any more object with static TLS 解决办法 有很多答案都说是将import torch放在imp
  • Arduino学习模拟输入

    1 通过电位器控制led亮度 2 代码很简单 如下 void setup Serial begin 9600 串口初始化 波特率设置为9600 pinMode 9 OUTPUT 设置9脚为输出模式 void loop int analogI
  • CNN+GRU实现验证码端到端识别

    Part 0 模型概览 captcha overview png 从图片到序列实际上就是Image2text也就是seq2seq的一种 encoder是Image decoder是验证码序列 由于keras不支持传统的在decoder部分每
  • 应用配置管理

    本节课程要点 ConfigMaps 和 Secret 资源的创建和使用 Pod 身份认证的实现和原理 容器资源 安全 前置校验等配置和使用 细分为以下八个方面 需求来源 背景问题 首先一起来看一下需求来源 大家应该都有过这样的经验 就是用一
  • STM32F103 USB OTA升级BootLoader (一)

    1 配置外部高速晶振 2 勾选USB功能 3 将USB模式配置Virtual Port Com 4 将系统主频配置为72M USB频率配置为48M 5 配置好项目名称 开发环境 最后获取代码 6 修改Flash大小和勾选Use Micro
  • 人的梦想 是不会结束的!

    文章目录 前言 一 一年之约 1 学习嵌入式 2 探寻嵌入式之路 二 我的心跳 1 奉劝 2 行动 人的梦想是永远不会结束的 前言 随着在程序员这条路上不断发展 自己学得越多 就会感觉自己学的东西有多渺小 下面就说说2019年到2020年的
  • [ 对比学习篇 ] 经典网络模型 —— Contrastive Learning

    Author Horizon Max 编程技巧篇 各种操作小结 神经网络篇 经典网络模型 算法篇 再忙也别忘了 LeetCode 对比学习篇 经典网络模型 Contrastive Learning 01 InstDisc 结构框图 详解 效
  • 非科班自学计算机需要学习什么内容?

    文章目录 前言 一 方向 gt 语言的选择 1 1 语言vs方向 1 2 重要观点 二 自学方法 另外说到计算机相关基础推荐书籍 三 自学资源 前言 非计算机专业 又想通过自学找到计算机相关工作的同学还是很多的 并且这条路也是可行的 毕竟计
  • 2.2 Fabric核心配置文件的理解

    目标 了解Hyperledger Fabric对Peer节点的核心配置信息 了解Hyperledger Fabric对orderer节点的核心配置信息 任务实现 在Hyperledger Fabric中 有两个示例配置文件 一个为Peer节
  • GDB调试工具命令速查

    1 生成调试信息 一般来说GDB主要调试的是C C 的程序 要调试C C 的程序 首先在编译时 我们必须要把调试信息加到可执行文件中 使用编译 gcc g 的 g 参数可以做到这一点 gcc g test c g g test cpp 如果