大家好,欢迎来到IT知识分享网。
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
|
|
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 : 指定要查看的变量或表达式
| options参数 | 功能 |
|---|---|
| -pretty on | off | 以便于阅读的格式打印某个结构体变量的值,默认值为 off。该选项等同于单独执行 set print pretty on|off 命令。 |
| /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:内存查看的起始地址
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120763.html


