1.调试
(gdb) n/next // 执行一条语句,遇到hi函数调用,当作一条语句执行
(gdb) s/step // 执行一条语句,遇到函数时,进入函数
(gdb) fin/finsh // 执行完当前函数,返回到上一调用层,同时打印函数的返回值
(gdb) return <返回值> // 从当前函数当前指令处返回,返回值为指定值
(gdb) u/untile // 执行到当前语句后的一条语句,即便其为循环语句,也会直接执行完循环,并指向循环后的一条语句
(gdb) u/untile <location> // 执行到当前函数退出或到达当前函数指定的位置
(gdb) advance <location> // 执行到当前函数退出或到达当前函数或其调用函数指定的位置
(gdb) c/continue // 继续执行当前程序
(gdb) f/frame // 查看当前所在源文件及行号
(gdb) show endiam
2.停止点
2.1设置断点
// 设置普通断点:
(gdb) b/breakpoint <location>
<location>:
(gdb) b 123 // 在当前源文件第123行打断点
(gdb) b func // 在整个可执行程序中,调用函数func处打断点
(gdb) b test.c:12 // 在源文件test.c中的第12行打断点
(gdb) b +/-10 // 基于当前源文件的当前行向下/向上偏移10行的位置设置断点
(gdb) b *0x23456 // 当程序不包含调试信息时,在代码段的指定地址处打断点,当pc运行至该指令地址处暂停
(gdb) b // 如果包含调试信息,则在当前代码处设置断点;否则,在当前指令处设置断点
// 设置条件断点:
(gdb) b <location> if (expression)
// 样例如下:
(gdb) b test.c:12 if (count == 10) // 在test.c的第12行设置条件断点,当变量count的值等于10时暂停
(gdb) info b/break // 查看设置的所有停止点信息及编号
2.2.设置监视点
(gdb) watch <addr/变量> // 设置观察点,当一个变量的值发生变化时,程序会停下来
(gdb) rwatch <addr/变量> // 设置观察点,当一个变量被读时,停止程序
(gdb) awatch <addr/变量> // 设置观察点,当一个变量被读或写时,停止程序
(gdb) info watch // 查看所有设置的观察点
(gdb) watch <addr/变量> if (expression) // 设置条件监视点
2.3.设置捕捉点
(gdb) catch <event> // 当发生event事件时,停止程序
<event>:
throw // 一个C++抛出的异常
catch // 一个C++捕捉到的异常
exec // 调用系统调用exec时
fork // 调用系统调用fork时
vfork // 调用系统调用vfork时
load <libname> // 载入共享库(动态库链接库)时,可以不指定具体的库名
unload <libname> // 卸载共享库(动态库链接库)时,可以不指定具体的库名
(gdb) tcatch <event> // 设置一次捕捉点,一次之后就会被删除
2.4 维护停止点
// 修改停止点
(gdb) info b/break // 查看设置的所有停止点信息及编号
(gdb) condition <停止点号> <expression> // 给一个断点设置条件或修改一个条件停止点的条件
(gdb) condition <停止点号> // 清除停止点的条件
(gdb) ignore <停止点号> <count> // 忽略指定断点号的停止条件count次
// 可以使用 delete/clear/disable/enable 这几个命令维护停止点
(gdb) dis/disable b/breakpoint <断点号范围> // 去使能指定的断点
(gdb) enable b/breakpoint <断点号范围> // 使能指定的断点
(gdb) enable b/breakpoint once <断点号范围> // 使能指定的断点,只生效一次后去使能
(gdb) enable b/breakpoint delete <断点号范围> // 使能指定的断点,只生效一次后删除
(gdb) del/delete b/breakpoint <断点号范围> // 删除指定的断电
(gdb) clear // 清除已定义的所有停止点
(gdb) clear <func/filename:func> // 清除指定函数内的所有停止点
(gdb) clear <linenum/filename:linenum> // 清除指定行号上所有的停止点
2.5 为停止点设定运行命令
(gdb) break/watck <location> if (expression)
(gdb) commands
> <command lists> // 设置触发条件停止点时的运行命令
> continue
> end
// 样例如下:
(gdb) b foo.c if (x > 0)
(gdb) commands
> printf "x is %d\n", x // 当x > 0 时,打印x的值
> continue
> end
3.变量查看修改及打印
(gdb) p/print/inspect [/<显示格式>] <表达式>
<显示格式>:
x: 以16进制打印
d: 以10进制打印
u: 以10进制无符号数打印
o: 以八进制无符号数打印
t: 以二进制格式打印
a: 以地址格式打印,内容包括16进制地址以及相关信息
c: 以字符形式打印
f: 以浮点格式打印
(gdb) p *<addr>@<数组元素个数> // 查看数组元素
(gdb) p/printf "<表达式>", <变量> // 输出变量的信息
// 样例如下:
(gdb) p *a@10 // 前提:int a[10] = { 0 }; 输出:打印数组a的所有元素
(gdb) p "x = %d\n", x // 输出x的值
(gdb) i/info loc/locals // 查看局部变量
(gdb) i/info scope // 查看作用域的局部变量
(gdb) i/info r/register // 查看寄存器
(gdb) i/info all-registers // 查看所有寄存器,并列出他们的内容
(gdb) i/info float // 查看浮点寄存器
(gdb) i/info addr/address <变量名> // 查看变量的地址
(gdb) i/info b/breakpoints // 查看所有的断点信息
(gdb) i/info fr/frame <N> // 列出当前N层堆栈信息,N缺省时默认打印第一层
(gdb) i/info stack <N> // 打印当前N层调用栈信息,N可缺省
(gdb) i/info stack full <N> // 打印当前N层调用栈信息,并打印每层栈中局部变量的值, N可缺省
(gdb) i/info func/functions // 查看所有函数定义
(gdb) i/info threads // 查看当前已知的线程
(gdb) i/info watch/watchpoints // 查看所有的监视点信息
(gdb) x/s <addr> // 打印字符串
(gdb) x/i <addr> // 以汇编方式查看
4.查看调用栈
(gdb) bt/backtrace/where <N> // 打印当前N层调用栈信息,N可缺省
(gdb) bt/backtrace/where full <N> // 打印当前N层栈信息,并打印每层栈中局部变量的值,N可缺省
(gdb) f/frame <栈帧编号> // 打印对应栈帧编号的调用信息
(gdb) i/info fr/frame <N> // 列出当前N层堆栈信息,N缺省时默认打印第一层
(gdb) i/info stack <N> // 打印当前N层调用栈信息,N可缺省
(gdb) i/info stack full <N> // 打印当前N层调用栈信息,并打印每层栈中局部变量的值, N可缺省