GDB Tutorial调试命令总结
什么是GDB
常用操作速查
GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。
命令 | 解释 | |
---|---|---|
file <path-to/*.elf> | 加载符号表 | |
c | Continue,继续执行被调试程序,直至下一个断点或程序结束 | |
b | 设置断点 | |
s | step,执行一行源程序代码,如果此行代码中有函数调用,则进入该函数 | |
si | setp instruction, si命令类似于s命令,si针对汇编指令,s针对源码 | |
n | next,执行一行源程序代码,此行代码中的函数调用也一并执行,相当于step over | |
ni | ni针对汇编指令,n针对源码 | |
p |
Print的简写,显示指定变量(临时变量或全局变量)的值。可以是局部变量也可以是全局变量 | |
i | info,用于显示各类信息,详情请查阅“help i”。 | |
i line | 显示当前行号 | |
q | quit,退出gdb | |
help | 对各类命令的详细介绍 | |
基本操作
启动调试
读写内存断点
watch *(int*)0x22cbc0
编译
启动方式
设置断点
查看源码
打印查看
变量、表达式
地址
gdb中使用“x”命令来打印内存的值,格式为“x /nfu addr”。含义为以f格式打印从addr开始的n个长度单元为u的内存值。参数具体含义如下:
a)n:输出单元的个数。
b)f:是输出格式。比如x是以16进制形式输出,o是以8进制形式输出,等等。
c)u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(word),g是八个byte(giant word)。
以16进制格式打印地址的8个word的值:
x /8xw addr
最简单的就是,以16进制形式打印当前地址一个字
x addr
修改变量、地址、表达式
set var a =5
set {int}0x83040 = 4
查询运行信息
where/bt :当前运行的堆栈列表;
bt backtrace 显示当前调用堆栈
up/down 改变堆栈显示的深度
set args 参数:指定运行时的参数
show args:查看设置好的参数
info program: 来查看程序的是否在运行,进程号,被暂停的原因。
info variables :查看全局和静态变量
info locals :查看当前stack frame局部变量
info args :查看当前stack frame参数
窗口
layout:用于分割窗口,可以一边查看代码,一边测试:
layout src:显示源代码窗口
layout asm:显示反汇编窗口
layout regs:显示源代码/反汇编和CPU寄存器窗口
layout split:显示源代码和反汇编窗口
保持历史命令
使用命令历史
-
默认情况在TUI模式下,上下箭头(Up, Down)按键已经被转成,代码窗口的上下移动,可以使用:Ctrl+P和Ctrl+N来调用前一条命令或后一条命令
-
可以输入focus next来激活命令窗口,这样上下箭头(Up, Down)按键又编程前一条命令和后一条命令
下次启动gdb时,直接查找使用之前的历史命令
- 在gdb中,缺省是不保存历史命令的。你可以通过如下命令来设置成保存历史命令:
(gdb) set history save on
但是,历史命令是缺省保存在了当前目录下的.gdb_history文件中。可以通过如下命令来设置要保存的文件名和路径:
(gdb) set history filename <file's name>
现在,我们把这两个命令放到$HOME/.gdbinit文件中:
set history filename ~/.gdb_history
set history save on
Ref
GDB中文指南
快速查找,理解
- https://wizardforcel.gitbooks.io/100-gdb-tips/content/print-registers.html
- http://c.biancheng.net/view/8123.html
- https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/gdb.html
GDB官方资料
other
在线gdb工具:https://www.onlinegdb.com/