GDB常用命令

GDB常用命令

1、GDB基础命令

命令含义r重新执行q退出gdbn下一步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 查看函数调用堆栈信息,用于发生段错误时,追踪错误

【查看所有线程的调用栈】thread apply all 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

3.2 调试多线程常用命令

#查看所有线程的信息

info threads

#切换到指定线程

thread

#在行line为线程tid打断点

b thread

#线程锁定

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 默认选项,同-g22-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:内存查看的起始地址

7、查看Coredump文件

前置条件:1)启用coredump生成(2种方式:临时启用和永久生效) 2)可执行文件编译时包含调试符号(gcc -g)

gdb <可执行程序> #使用GDB分析coredump文件

常用命令:

命令作用示例输出片段bt 或 where查看崩溃时的调用堆栈#0 0x00007f in func() at file.c:10bt full显示完整堆栈及局部变量var = 0x5info registers查看寄存器值rax = 0x0disassemble反汇编当前函数0x0000555: mov eax, [rbp-4]x/[长度] <地址>检查内存数据0x7ffd: 0xdeadbeef

相关创意