1.查看文件
在GDB中输入l(list)就可以查看所载入的文件
2.设置断点
用break来设置断点。下面有几种设置断点的方法
break function
在进入指定函数时停住。
break linenum
在指定行号停住。
break +offset, break -offset
在当前行的前面或后面的offset行停住。offset为自然数。
break filename: linenum
在源文件 filename的linenum行停住。
break filename: function
在源文件filename的function函数入口处停住。
break *address
在程序运行的内存地址处停住。
3.查看断点
使用info命令
info breakpoints [n]
info break [n]
info b [n]
4.运行代码
输入r(run)即可(GDB默认从首行开始运行代码,若是想从程序中指定行开始运行,可在后r后面加上行号)。
5.查看变量值
p +变量。
6.恢复程序和单步运行
使用continue命令恢复程序的运行直到下一个断点或程序结束。
使用step或者next来单步执行。
step:单步运行,遇到函数则进入函数
next:单步运行,不会进入函数
7.GDB命令行常用参数
选项 | 含义 |
---|---|
–help -h | 列出命令行参数 |
–exec=file -e file | 指定可执行文件 |
–core=core-file -c core-file | 指定core文件 |
–command=file -x file | 从指定文件中读取GDB命令 |
–directory=directory -d directory | 把指定目录加入到源文件搜索路径中 |
–cd=directory | 以指定目录作为当前路径来运行GDB |
–nx -n | 不要执行.gdbinit文件中的命令。 默认情况下,这个文件中的命令会在所有命令行参数处理完成后执行 |
–batch | 在非交互模式下运行GDB。从 |
–symbols=file -s file | 从指定文件中读取符号表 |
-write | 允许对可执行文件和core文件进行写操作 |
–quiet -q | 不要打印介绍和版权信息 |
–tty=device | 指定device为运行程序的标准输入和输出 |
–pid=process-id -p process-id | 指定要附属的进程ID |
8.GDB基本命令
8.1 查看基本信息相关命令
命令 | 描述 |
---|---|
help | 列出GDB帮助信息 |
help topic | 列出相关话题中的GDB命令 |
help command | 列出命令描述信息 |
apropos search-word | 搜索相关的话题 |
info argsi args | 列出运行程序的命令行参数 |
info breakpoints | 列出断点 |
info break | 列出断点号 |
info break breakpoint-number | 列出指定断点的信息 |
info watchpoints | 列出观察点 |
info registers | 列出使用的寄存器 |
info threads | 列出当前的线程 |
info set | 列出可以设置的选项 |
8.2 断点操作相关命令
命令 | 描述 |
---|---|
break function break line-number | 在指定的函数,或者行号处设置断点 |
break +offset break -offset | 在当前停留的地方前面或后面的几行处设置断点 |
break file:func | 在指定的file文件中的第func处设置断点 |
break file:nth | 在指定的file文件中的第nth行设置断点 |
break *address | 在指定的地址处设置断点。一般在没有源代码时使用 |
break line-number if condation | 如果条件满足在指定位置设置断点 |
break line thread thread-number | 在指定的线程中中断。使用info threads可以显示线程号 |
tbreak | 设置临时的断点。中断一次后会被删除 |
watch condition | 当条件满足时设置观察点 |
clear clear func clear nth | 清除函数func处的断点 清除第nth行处的断点 |
delete d | 删除所有断点或观察点 |
delete breakpoint-number delete range | 删除指定的断点、观察点 |
disable breakpoint-number-or-range enable breakpoint-number-or-range | 不删除断点,仅仅把它设置成为无效,或有效 例子: 显示断点: info break 设置无效:disable 2-9 |
enable oncebreakpoint-number | 设置指定断点有效,当到达断点时设置为无效 |
enable delbreakpoint-number | 设置指定断点有效,当到达断点时删除它 |
finish | 继续执行到函数结束 |
8.3 单步调试相关命令
命令 | 描述 |
---|---|
step s | 进入下一行代码的执行,会进入函数内部 |
step number-of-steps-to-perform | 进入下一行代码的执行,会进入函数内部 |
next n next number | 执行下一行代码。但不会进入函数内部 |
until until line-number | 继续运行直到到达指定行号,或者函数、地址等 |
return return expression | 弹出选中的栈帧(stack frame)。如果后面指定参数,则返回表达式的值 |
stepi si nexti ni | 执行下一条汇编/CPU指令 |
info signals info handle handle SIGNAL_NAME option | 当收到信号时执行下列动作:nostop(不要停止程序),stop(停止程序执行),print(显示信号),noprint(不显示),pass/noignore(允许程序处理信号),nopass/ignore(不让程序接受信号) |
where | 显示当前的行号和所处的函数 |
8.4 调试栈信息相关命令
命令 | 描述 |
---|---|
backtrace bt bt inner-function-nesting-depth bt -outer-function-nesting-depth | 显示当前堆栈的追踪,当前所在函数 |
backtrace full | 打印所有局部变量的值 |
frame number f number | 选择指定的栈帧 |
up number down number | 向上或向下移动指定个数的栈帧 |
info frame addr | 描述选中的栈帧 |
info args info all-reg info locals info catch | 显示选中栈帧的参数、局部变量、异常处理函数。all-reg也会列出浮点寄存器 |
8.5 查看代码相关命令
命令 | 描述 |
---|---|
list l list line-number list function list start#,end# list filename:function | 列出相应的源代码 |
set listsize count show listsize | 设置list命令打印源代码时的行数 |
directory directory-name dir directory-name show directories | 在源代码路径前添加指定的目录 |
directory | 当后面没有参数时,清除源代码目录 |
8.6 打印变量相关命令
命令 | 描述 |
---|---|
print variable p variable p file::variable p ‘file’::variable | 打印指定变量的值 |
p *arry-var@length | 打印arry-var中的前length项 |
p/x var | 以16进制打印整数变量 var |
p/d var | 把变量 var当作有符号整数打印 |
p/u var | 把变量 var当作无符号整数打印 |
p/o var | 把变量 var当做8进制数打印 |
p/t var x/b address x/b &variable | 以整数二进制的形式打印var变量的值 |
p/c variable | 当字符打印 |
p/f variable | 以浮点数格式打印变量var |
p/a variable | 打印16进制形式的地址 |
x/w address x/4b &variable | 打印指定的地址,以四字节一组的方式 |
call expression | 类似于print,但不打印void |
disassem addr | 对指定地址进行反汇编 |
8.7 设置显示选项相关命令
命令 | 描述 |
---|---|
set gdb-optionvalue | 设置GDB的选项 |
set print arry on set print arry off show print arry | 以可读形式打印数组。默认是off |
set print arry-indexes on set print arry-indexes off show print arry-indexes | 打印数组元素的下标。默认是off |
set print pretty on set print pretty off show print pretty | 格式化打印C结构体的输出 |
set print union on set print union off show print union | 打印C中的联合体。默认是on |
set print demangle on set print demangle off show print demangle | 控制C++中名字的打印。默认是on |
8.8 文件操作相关命令
命令 | 描述 |
---|---|
info files info share | 列出当前的文件、共享库 |
file file | 把file当作调试的程序。如果没有指定参数,则丢弃 |
core file | 把file当作core文件。如果没有指定参数,则丢弃 |
exec file | 把file当作执行程序。如果没有指定参数,则丢弃 |
symbol file | 从file中读取付符号表。如果没有指定参数,则丢弃 |
load file | 动态链入file文件,并读取它的符号表 |
path directory | 把目录directory加入到搜索可执行文件和符号文件的路径中 |
8.9 程序执行相关命令
命令 | 描述 |
---|---|
run r run command-line-arguments run infile/outfile | 从头开始执行程序,也允许进行重定向 |
continue c | 继续执行直到下一个断点或观察点 |
continue number | 继续执行,但会忽略当前的断点number次。 当断点在循环中时非常有用 |
kill | 停止程序执行 |
quit q | 退出GDB调试 |