gdb教程(2):控制程序的执行

gdb可以说等价于你的程序的解释器,本文将介绍如何使用gdb查看你的程序执行状态。

相关文章

gdb教程(1):如何开始
gdb教程(2):控制程序的执行
gdb教程(3):断点(breakpoint)和观察点(watchpoint)
gdb教程(4):函数调用栈

通过上一篇教程,你已经知道如何使用gdb来开始你的调试。现在,我们来介绍如何开始真正的调试。通过组合键CTRL+C,你可以随时让你的程序暂停运行,你还可以使用断点(breakpoint)来让程序在任意一行暂停,当程序暂停时,你不仅可以查看当前正在运行的代码,还可以查看并修改每一个变量的值。

暂停/继续 Debug程序

使用组合键CTRL+C来发送SIGINT信号来通知gdb暂停正在运行的程序。

(gdb) run
Starting Program: /home/ug/ryansc/a.out

Program received signal SIGINT, Interrupt.
0x80483b4 in main(argc=1, argv=0xbffffda4) at loop.c:5
5 while(1){
...
(gdb)

当程序处于暂停状态时,你可以使用continue命令来让程序继续执行,gdb对部分常用的命令支持简写,在这里我们可以使用简写命令c代替continue命令,两者的效果是一样的。

注意:gdb几乎所有的命令都只能在程序暂停状态下输入。

查看程序当前执行位置

使用list命令(简写为l)来查看程序当前正在执行的代码,list命令会打印出当前执行代码附近的代码。例如下面的例子,当前代码执行到第8行,list命令会打印第8行附近的代码。

$ (gdb) list
3 int main(int argc, char **argv)
4 {
5 int x = 30;
6 int y = 10;
7
8 x = y;
9
10 return 0;
11 }

按行执行代码

使用next命令(简写为n)或着step命令(简写为s)来一行一行地执行你的代码。

5   while(1){
(gdb) next
7 }
(gdb)

注意stepnext是不同的,对于有函数调用的行,使用step命令会进入函数内部,而使用next命令则会直接跳过当前函数执行下一行。看下面的例子:

使用next命令时,函数fun1()被跳过。

(gdb)
11 fun1();
(gdb) next
12 }

使用step命令时,gdb进入函数fun1()内部。

(gdb)
11 fun1();
(gdb) step;
fun1 () at loop.c:5
5 return 0;
(gdb)

查看变量

使用print命令(简写为p)来打印当前作用域中的变量。假设你有两个变量int nchar* s,可以使用print命令来查看变量的具体内容。gdb会根据变量类型来确定输出格式。

(gdb) print n
$1 = 900
(gdb) print s
$3 = 0x8048470 "Hello World!\n"
(gdb)

gdb同时也支持对类结构变量的打印,借助this指针,你可以打印一个类的所有成员的值。

(gdb) print *this
$1 = {a=1, b=2, c="abc"}
(gdb)

注意:所有print返回都是$### = {value}格式的,$###中的数字是gdb用来记录你所检查的每一个变量的。

修改变量

使用set命令修改变量,例如,我们想要把int n的值改为3。

(gdb) set n = 3
(gdb) print n
$4 = 3

在一部分版本的gdb中,你需要使用set var命令代替set命令,例如set var n = 3

调用函数

使用call命令,你可以调用几乎程序中的任何函数,包括系统库的函数和你自己实现的函数,例如:

(gdb) call abort()

从当前函数退出

当我们使用step命令进入一个函数后,可以使用finish命令让程序自动运行直到函数退出。这个命令还会告诉你函数的返回值(如果有)。finish命令的简写为fin

(gdb) finish
Run till exit from #0 fun1 () at test.c:5
main (argc=1, argv=0xbffffaf4) at test.c:17
17 return 0;
Value returned is $1 = 1

本节到这里就结束了,下一节我会介绍gdb中的断点(breakpoint)以及观察点(watchpoint)相关的操作。

参考资料

RMS’s gdb Tutorial: How do I watch the execution of my program?
Continuing and Stepping - Debugging with GDB
Debugging with GDB - List

此文有用? 求鼓励!

显示 Gitment 评论