GDB常用命令

1、GDB基础命令

命令含义
r重新执行
q退出gdb
n下一步
c继续执行

b

普通断点

打断点

【普通断点】b file.c :行号

【条件断点】b file.c : 行号 if num == 2

【查看断点】info b

【删除断点】del 2

【禁用/启用】disable / enable 2

watch

观察断点

【监控num】watch num 

当被监控变量/表达式的值发生改变时,程序停止运行

【查看观察断点】info watchpoints

  • 监控局部变量num:一旦num失效,则监控操作也随即失效。
  • 监控指针变量*p:  watch *p表示监控p所指数据的变化情况;watch p表示监控p指针本身是否改变指向。
  • 监控数组a[10]中的元素:watch a表示只要数组a中元素发生改变,程序就会停止执行。

catch

捕捉断点

                
bt查看函数调用堆栈信息,用于发生段错误时,追踪错误
display

【频繁查看变量】display num   程序每暂停一次(遇断点或单步调试),自动打印变量num值

【禁用/启用】disable / enable display num

list默认显示当前行的上5行和下5行的源代码

2、GDB print 高级用法

print命令完整语法格式如下:

(gdb) print [options --] [/fmt] expr           //[ ]括起来的部分是可选的,可以使用也可以省略

  • options : 控制指定输出内容的变量或表达式的值
  • fmt : 指定输出变量或表达式值所采用的格式
  • expr : 指定要查看的变量或表达式
表1 options参数的取值
options参数功能
-pretty on | off以便于阅读的格式打印某个结构体变量的值,默认值为 off。该选项等同于单独执行 set print pretty on|off 命令。
表2 /fmt常用的取值
/fmt功能
/x以十六进制的形式打印出整数。
/d以有符号、十进制的形式打印出整数。
/u以无符号、十进制的形式打印出整数。
/o以八进制的形式打印出整数。
/t以二进制的形式打印出整数。
/f以浮点数的形式打印变量或表达式的值。
/c以字符形式打印变量或表达式的值。

      options 参数和 /fmt 或者 expr 之间,必须用--( 2 个 - 字符)分隔。options 参数还有很多选项可以使用,可自行前往 GDB官网查看。

       当 print 命令不指定任何 options 参数时,print 和 /fmt 之间不用添加空格,例如以十六进制的形式输出 num 整形变量的值,执行命令为 (gdb) print/x num。

3、GDB其他命令

3.1 调试多进程常用命令

#设置调试子进程|父进程,默认调试父进程
set follow-fork-mode  [child | parent]

#设置fork后是否断开(detach)某个进程的调试
set detach-on-fork [off | on]       #off:同时调试父进程和子进程;on:只调试父进程

#让父子进程同时运行
set schedule-multiple on 

#查看所有进程信息
info inferiors

#切换到指定进程
inferiors <pid>

3.2 调试多线程常用命令

#查看所有线程的信息
info threads

#切换到指定线程
thread <tid>

#在行line为线程tid打断点
b <line> thread <tid>

#线程锁定
set scheduler-locking [off | on | step]

-off: 默认值,不锁定其他线程
-on: 调试当前线程时,其余线程锁定,阻塞等待
-step: step单步调试当前线程时,其余线程不执行;但使用其他命令(如next)调试时,允许其他线程执行

3.3 处理信号 — handle命令

#忽略指定信号
handle SIGPIPE nostop

3.4 输出重定向 — tee命令

  • 方式1:
# gdb.sh

(gdb |tee  /usr/local/aarch64/info.txt )<< GDBEOF
file /usr/local/aarch64/ioserver/ioserver
handle SIGPIPE nostop noprint
set print pretty on
r
GDBEOF
  • 方式2:
#调试程序a.out, 保存输出信息到文件info.txt
gdb a.out | tee info.txt

3.5 改变程序变量—— set var  

#程序运行过程中,修改变量值
set var x=4;

3.6 断点命令列表 —— commands 

#让GDB在每次到达某一个断点时自动执行一组命令

commands  breakpoint-number  //将一下命令添加到指定的断点上
    print "111"  //commands命令1
    print "222"  //commands命令2
    c           //commands命令3:继续执行
end             //commands命令结束符

4、GDB自定义命令

GDB自定义命令介绍

   GDB中有一个非常强大的功能,允许用户根据具体场景需求自定义命令。具体格式如下:

define cmd_name
command list
end

自定义命令以define开始,后面跟命令名字,并且以end结束。define和end中间是具体的实现逻辑。

与自定义命令相关的几个GDB内建变量:

序号条目描述
1$argc自定义命令的参数个数
2$arg0自定义命令的第一个参数
3$arg1自定义命令的第二个参数
4$arg2自定义命令的第三个参数
5$argN自定义命令的第N+1个参数
  • 应用1:两数相加
define add
Print $arg0+$arg1
end

在GDB中运行效果如下:

  • 应用2:链表打印

将上述代码保存到一个print-list.gdb脚本文件中,对代码内容解释一下,$arg0 为链表表头,$arg1表示为打印链表的节点个数,$arg2 链表的数据类型,$arg3下一个指针标识。此时在gdb按照下图示意:

按照上述操作,可以方便地打印出链表节点内容。也可以命令定义别名:alias pl=print-list,方便后续调用 。

5、GDB查看调试信息 — GCC的调试选项 -g

         一个程序想要进行GDB调试,必须在GCC编译时加上“-g”。大家也许知道,在编译时的优化选项“-Ox”,可以进行不同等级的优化以及精简。同样“-g”也有几个等级可选。

序号条目描述
1-g 默认选项,同-g2
2-g0不生成任何调试信息,和编译时不加“-g”一样
3-g1生成最少量的调试信息,这些信息足够用来通过backtrace查看调用栈符号信息。主要是包括了函数声明,外部变量,行号等信息,但是不包括局部变量信息。该选项比较少使用。
4-g2生成足够多的调试信息,可以使用GDB进行正常的程序调试,这个是默认选项。
5-g3在“-g2”基础上生成更多的信息,如宏定义。

6、GDB内存查看命令-- examine

examine是GDB中x命令的全称,用于检查内存中的内容。

#examine命令的一般格式如下:
x/NFU ADDR
  • N:希望显示的内存单位数
  • F:显示格式,如:o(八进制)、x(十六进制)、d(十进制)、u(无符号十进制)、t(二进制)、a(地  址)、i(指令)、c(字符)或f(浮点数)。
  • U: 内存单位,如:b(字节)、h(半字,两个字节)、w(字,四个字节)或g(双字,八个字节)
  • ADDR:起始地址
(gdb) examine/4xb 0x40063c 
0x40063c: 0x01 0x23 0x45 0x67

#  4xb: 以字节为单位,显示4个单位,以十六进制显示; 0x40063c:内存查看的起始地址

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值