GDB调试命令大全

GDB调试命令大全

  • 启动
  • 运行
  • 设置/查看断点(breakpoint)
  • 设置/查看观察点(watchpoint)
  • 设置/查看捕捉点(catchpoint)
  • 维护停止点
  • 维护条件停止点
  • 停止点设置运行命令
  • 断点菜单
  • 恢复程序运行和单步调试
  • 信号
  • 产生信号量
  • 线程

转载自: https://www.cnblogs.com/gqtcgq/p/7511974.html

启动

$ gdb program
# program是你的可执行文件,一般在当前目录
$ gdb program core
# gdb同时调试运行程序和core文件,core是程序非法执行产生的文件
$ gdb program pid# 如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

运行

(gdb) r/run             # 开始运行程序
(gdb) c/continue        # 继续运行
(gdb) n/next            # 下一行,不进入函数调用
(gdb) s/step            # 下一行,进入函数调用
(gdb) ni/si             # 吓一跳指令,ni和si区别同上
(gdb) fini/finish       # 继续运行至函数退出/当前栈帧
(gdb) u/util            # 继续运行至某一行,在循环中,u可以实现运行至循环刚刚退出,但这取决于循环的实现


(gdb) set args          # 设置程序启动参数,如:set args 10 20 30
(gdb) show args         # 查看程序启动参数
(gdb) path <dir>        # 设置程序的运行路径
(gdb) show paths        # 查看程序的运行路径
(gdb) set env <name=val># 设置环境变量,如:set env USER=chen
(gdb) show env [name]   # 查看环境变量
(gdb) cd <dir>          # 相当于shell的cd命令
(gdb) pwd               # 显示当前所在目录
(gdb) shell <commond>   # 执行shell命令

设置/查看断点(breakpoint)

(gdb) b/break linenum/func      # 在第 linenum 行或 function 处停住
(gdb) b/break +/-offset         # 在当前行号后/前offset行停住
(gdb) b/break filename:linenum  # 在源文件filename的linenum行停住
(gdb) b/break filename:func     # 在源文件的function入口停住
(gdb) b/break *address          # 在内存地址address处停住
(gdb) b/break                   # 没有参数,表示下一跳指令处停住
(gdb) b/break if <condition>    # 条件成立是停住,如在循环中:break if i=100
(gdb) info break [n]            # 查看断点, n表示断点号

设置/查看观察点(watchpoint)

  • 观察点一搬来观察某个表达式或变量的值是否有变化了,有:程序停住
(gdb) watch <expr>              # 观察值是否有变化
(gdb) rwatch <expr>             # 当expr被读取时,停住
(gdb) awatch <expr>             # 当expr被读取或写入时,停住
(gdb) info watchpoints          # 查看所有观察点

设置/查看捕捉点(catchpoint)

  • 你可设置捕捉点来补捉程序运行时的一些事件。如:载入共享库(动态链接库)或是C++的异常。
(gdb) tcatch <event>            # 只设置一次捕捉点
(gdb) catch <event>             # 当event发生时,停住程序,如下:# throw             一个c++抛出的异常(throw为关键字)# catch             一个C++捕捉到的异常(catch为关键字)# exec              调用系统调用exec时(只在HP-UX下有用)# fork              调用系统调用fork时(只在HP-UX下有用)# vfork             调用系统调用vfork时(只在HP-UX下有用)# load [file]       载入共享库(动态链接库)时(只在HP-UX下有用)# unload [libname]  卸载共享库(动态链接库)时(只在HP-UX下有用)

维护停止点

  • 上面说了三种如何设置停止点的方法。在gdb中如果你觉得已经定义好的停止点没有用,那么你可以delete、clear、disable、enable进行维护
(gdb) clear                     # 清除所有已定义的停止点。如果程序运行,清除当前行之后的
(gdb) clear <fuction>           # 清除所有设置在函数上的停止点
(gdb) clear <file:line>         # 清除所有设置在指定行上的停止点
(gdb) d/delete [n]/[m-n]        # 删除断点号,不设置则删除全部,也可以范围m-n


  • 比删除更好的一种方法是disable停止点,disable了的停止点,GDB不会删除,当你还需要时,enable即可,就好像回收站一样。
(gdb) disable [n]/[m-n]         # disable指定断点号n,不指定则disable所有,也可以范围m-n
(gdb) enable [n]/[m-n]          # enable断点n,也可以范围m-n
(gdb) enable once [n]/[m-n]     # enable断点n一次,程序停止后自动disable,也可以范围m-n
(gdb) enable delete [n]/[m-n]   # enable断点,程序结束自动删除,也可以范围m-n

维护条件停止点

  • 前面说到设置breakpoint可以设置成一个条件,这里列出相关的维护命令
(gdb) condition <bunm> <expr>   # 修改断掉号bnum的停止条件
(gdb) condition <bnum>          # 清除断点号bnum的停止条件
  • ignore 可以指定程序运行时,忽略停止条件几次
(gdb) ignore <bnum> <count>     # 忽略断点号hnum的停止条件count次

停止点设置运行命令

  • 当程序停住时,我们可以通过command设置其自动执行的命令,这很利于自动化调试。
(gdb) commands [bnum]> ... commands list ...> end                   # 这里为断点号bnum设置一个命令列表
  • 例如
(gdb) break foo if x>0(gdb) commands> printf "x is %dn",x> continue> end断点设置在函数foo中,断点条件是x>0,如果程序被断住后,也就是,一旦x的值在foo函数中大于0,GDB会自动打印出x的值,并继续运行程序。
如果你要清除断点上的命令序列,那么只要简单的执行一下commands命令,并直接在打个end就行了。

断点菜单

  • 如果你使用c++,有可能下断点时遇到相同名字的函数,gdb会为你列出该函数菜单供你选择。

例如:

(gdb) b String::after[0] cancel[1] all[2] file:String.cc; line number:867[3] file:String.cc; line number:860[4] file:String.cc; line number:875[5] file:String.cc; line number:853[6] file:String.cc; line number:846[7] file> 2 4 6Breakpoint 1 at 0xb26c: file String.cc, line 867.Breakpoint 2 at 0xb344: file String.cc, line 875.Breakpoint 3 at 0xafcc: file String.cc, line 846.

恢复程序运行和单步调试

  • 当程序被停住了,你可以用c/continue恢复运行,或下一个断点到来。也可以使用step或next命令单步跟踪程序。
(gdb) c/continue [ignore-count]     # 恢复程序运行,ignore-count忽略后面断点数
  • 单步跟踪,如果有函数调用,他会进入该函数。进入函数的前提是,此函数被编译有debug信息。很像VC等工具中的stepin。后面可以加count也可以不加,不加表示一条条地执行,加表示执行后面的count条指令,然后再停住。
(gdb) step <count>

  • 打开step-mode模式,于是,在进行单步跟踪时,程序不会因为没有debug信息而不停住。这个参数有很利于查看机器码。
(gdb) set step-mode on
  • 当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
(gdb) u/until
  • 单步跟踪一条机器指令!一条程序代码有可能由数条机器指令完成,stepi和nexti可以单步执行机器指令。与之一样有相同功能的命令是“display/i $pc” ,当运行完这个命令后,单步跟踪会在打出程序代码的同时打出机器指令(也就是汇编代码)
(gdb) si/stepi
(gdb) ni/stepi

信号

  • 信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。
  • GDB有能力在你调试程序的时候处理任何一种信号,你可以告诉GDB需要处理哪一种信号。你可以要求GDB收到你所指定的信号时,马上停住正在运行的程序,以供你进行调试。你可以用GDB的handle命令来完成这一功能。
(gdb) handle <signal> <keywords...>
  • 在GDB中定义一个信号处理。信号可以以SIG开头或不以SIG开头,可以用定义一个要处理信号的范围(如:SIGIO-SIGKILL,表示处理从SIGIO信号到SIGKILL的信号,其中包括SIGIO,SIGIOT,SIGKILL三个信号),也可以使用关键字all来标明要处理所有的信号。一旦被调试的程序接收到信号,运行程序马上会被GDB停住,以供调试。其可以是以下几种关键字的一个或多个。
  nostop            # 当被调试的程序收到信号时,GDB不会停住程序的运行,但会打出消息告诉你收到这种信号。
  stop          # 当被调试的程序收到信号时,GDB会停住你的程序。
  print         # 当被调试的程序收到信号时,GDB会显示出一条信息。
  noprint           # 当被调试的程序收到信号时,GDB不会告诉你收到信号的信息。
  pass/noignore # 当被调试的程序收到信号时,GDB不处理信号。这表示,GDB会把这个信号交给被调试程序会处理。
  nopass/ignore # 当被调试的程序收到信号时,GDB不会让被调试程序来处理这个信号。
  • 查看有哪些信号在被GDB检测中。
(gdb) info signals
(gdb) info handle

产生信号量

  • 使用singal命令,可以产生一个信号量给被调试的程序。如:中断信号Ctrl+C。这非常方便于程序的调试,可以在程序运行的任意位置设置断点,并在该断点用GDB产生一个信号量,这种精确地在某处产生信号非常有利程序的调试。语法是:

    (gdb) signal <singal>
    
  • UNIX的系统信号量通常从1到15。所以取值也在这个范围。

  • single命令和shell的kill命令不同,系统的kill命令发信号给被调试程序时,是由GDB截获的,而single命令所发出一信号则是直接发给被调试程序的。

线程

  • 当你的程序时多线程的,你可以定义断点是否在所有线程或某个线程
(gdb) info threads                          # 查看线程
(gdb) break <line> thread <threadno>        # 指定源程序line行,线程threadno停住
(gdb) break <line> thread <threadno> if...  # 指定源程序line行,线程threadno停住,跟上条件

例如:

(gdb) break frik.c:13 thread 28 if bartab > lim

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

树的三种遍历方式-算法

题目 树的三种遍历方式&#xff0c;前序&#xff0c;中序&#xff0c;后续 解题 通过递归 public static List<Integer> preorderTraversal(TreeNode treeNode) {List<Integer> result new ArrayList<>();if (treeNode null) {return result;}List<…

python coding with ChatGPT 打卡第18天| 二叉树:从中序与后序遍历序列构造二叉树、最大二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

【Spring基础】从0开始学习Spring(2)

前言 在上篇文章&#xff0c;我已经讲了Spring中最核心的知识点&#xff1a;IoC&#xff08;控制反转&#xff09;以及DI&#xff08;依赖注入&#xff09;。这篇文章&#xff0c;我将讲一下关于Spring框架中的其它比较琐碎但是又还是挺重要的知识点&#xff0c;因此&#xff…

【Android-Compose】手势检测实现按下、单击、双击、长按事件,以及避免频繁单击事件的简单方法

目录&#xff1a; 1 不需要双击事件 规避频繁单击事件2 需要双击事件&#xff08;常规写法&#xff09;3 后记&#xff1a;不建议使用上面的代码自定义按钮 1 不需要双击事件 规避频繁单击事件 var firstClickTime by remember { mutableStateOf(System.currentTimeMillis()…

vue实现查询搜索框下拉字典

字典表 前端页面显示 依据这个字典表实现动态查询 初始化数组 首先先在全局变量里定义一个数据存放查询出来的数据 data() {return {dicts: []};},生命周期 查询的时候是声明周期开始的时候&#xff0c;原本增删改查页面在生命周期开始的时候就查询了页面的数据获得了列表值…

ElasticSearch-SpringBoot整合ElasticSearch

六、SpringBoot整合ElasticSearch 1、浏览官方文档 1、查找跟ES客户端相关的文档 使用Java REST Client 选择Java Hight Level REST Client 2、创建项目的准备 1.找到原生的依赖 2.找到对象 3.分析这个类里面的方法 3、正式创建项目 1.创建工程 2.导入依赖 注意依赖版本…

Python 函数式编程进阶:map、filter、reduce

Python 函数式编程进阶&#xff1a;map、filter、reduce 介绍map 函数作用和语法使用 map 函数Lambda 函数的配合应用 filter 函数作用和语法使用 filter 函数Lambda 函数的结合运用 reduce 函数作用和语法使用 reduce 函数典型应用场景 介绍 在函数式编程中&#xff0c;map、…

【QT】opcuaServer 的构建

【QT】opcuaServer 的构建 前言opcuaServer实现测试 前言 在博文【opcua】从编译文件到客户端的收发、断连、节点查询等实现 中&#xff0c;我们已经介绍了如何在QT 中创建opucaClient 。在本期的博文中&#xff0c;我们基于之前的部署环境&#xff0c;介绍一下如何构建opcuaS…

springboot与Elasticsearch版本兼容对比

首先 大家在下载 Elasticsearch 时 最好先弄清楚版本 因为 如果 Spring Boot 版本 不兼容 Elasticsearch 那就是到头一场空了 Elasticsearch 版本 6.x 可以兼容 Spring Boot 2.x Elasticsearch 版本 7.x 可以兼容 Spring Boot 2.x 3.x 4x Elasticsearch 版本 7.x 以及 8.x 可以…

Flask 入门4:Flask 模板

1. 前言 Flask 拥有丰富的扩展方法&#xff0c;且都有统一的特点&#xff1a;简单和即学即用。当我们要实现某个功能之前&#xff0c;可以提前去搜一搜这个功能包是否已经存在&#xff0c;这样也能帮助我剩下很多时间。那么要去哪里找到这些扩展包呢&#xff0c;这里推荐两个方…

MySQL重要进程

MySQL的主要进程包括以下几种&#xff1a; 1.mysqld&#xff08;也称mysqld_safe&#xff09;&#xff1a;这是MySQL服务器的守护进程。它负责接收客户端连接、处理查询并管理数据库文件等操作。可通过命令行或配置文件来指定其运行参数。 2.mysqladmin&#xff1a;用于管理M…

模拟队列(数组实现)

题目 实现一个队列&#xff0c;队列初始为空&#xff0c;支持四种操作&#xff1a; push x – 向队尾插入一个数x&#xff1b;pop – 从队头弹出一个数&#xff1b;empty – 判断队列是否为空&#xff1b;query – 查询队头元素。 现在要对队列进行M个操作&#xff0c;其中的…

5G智能卷烟工厂数字孪生可视化平台,推进烟草行业数字化转型

5G智能卷烟工厂数字孪生可视化平台&#xff0c;推进烟草行业数字化转型。随着5G技术的不断发展&#xff0c;智能卷烟工厂数字孪生可视化平台成为了推进烟草行业数字化转型的重要手段。该平台将5G技术与数字孪生技术相结合&#xff0c;实现了对卷烟生产全过程的实时监控、数据分…

JAVA面试题之四谈谈你对RPC框架的理解

面试题之四 谈谈你对RPC框架的理解 难度指数&#xff1a;4星 考察频率&#xff1a;55-60% 开发年限&#xff1a;3年以上 一.RPC是什么&#xff1f; 远程过程调用&#xff1a;Remote Procedure call.可以跨进程&#xff0c;跨越同一个计算机的多个进程、多个JVM或多台计算…

ROE是什么?如何用ROE来分析企业?

ROE是什么&#xff1f; ROE&#xff0c;即净资产收益率&#xff08;Return on Equity&#xff09;&#xff0c;又称作股东权益报酬率、权益利润率&#xff0c;是净利润与平均股东权益的百分比&#xff0c;也称为净值报酬率、权益报酬率、权益利润率、净资产利润率&#xff0c;…

Knot Server XDP原理分析

目录 Knot Server XDP原理分析一、Kernel层代码分析1. kernel层源码的编译2. bpf-kenerl.c源码的分析 二、 User层代码分析 Knot Server XDP原理分析 xdp部分的代码分为Kernel层和User层两部分&#xff0c;Kernel层代码由User层代码调用linux bpf接口加载到网卡内核驱动&#…

网络选择流程分析(首选网络类型切换流程)

首先是界面,我在此平台的界面如下: 对应的入口源码位置在Settings的UniEnabledNetworkModePreferenceController中,当然其他平台可能在PreferredNetworkModePreferenceController中,流程上都是大同小异 然后点击切换按钮会调用到UniEnabledNetworkModePreferenceControlle…

为什么说Python语法简单?

Python被广泛认为是一种语法简单、易学易用的编程语言&#xff0c;这种观点有几个关键的原因&#xff1a; 1、清晰简洁的语法结构&#xff1a; Python采用了清晰而简洁的语法结构&#xff0c;使得代码易于阅读和理解。Python的语法设计强调代码的可读性&#xff0c;采用了清晰…

用的到的linux-删除文件-Day3

前言&#xff1a; 上一节&#xff0c;我们讲到了怎么去移动文件&#xff0c;其中使用到两大类的脚本命令即cp和mv。各两种命令都可以完成移动&#xff0c;但是cp是复制粘贴的方式&#xff0c;可以选择原封不动的复制粘贴过来&#xff0c;即不修改文件及文件夹的创建时间等&…

2024Node.js零基础教程(小白友好型),nodejs新手到高手,(五)NodeJS入门——http模块

044_http模块_创建HTTP服务端 hello&#xff0c;大家好&#xff0c;那这个小节我们来使用 nodejs 创建一个 http 的服务&#xff0c;有了这个 http 服务之后&#xff0c;我们就可以处理浏览器所发送过来的请求&#xff0c;并且还可以给这个浏览器返回响应。 顺便说一下&#x…