GDB调试指导

本文详细介绍了GDB调试工具的使用方法,包括如何执行、停止、查看程序状态,以及设置和管理断点、监视点和捕捉点。此外,还涵盖了变量查看、调用栈分析和运行命令配置等核心调试操作。通过对这些技巧的掌握,开发者可以更高效地定位和解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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可缺省

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值