爱生活,爱阅读
分类: LINUX
2012-09-18 18:07:02
Gdb函数有点类似于程序的解释器。你可以通过发送信号在任何时候停止程序的执行。通常是通过像ctrl+c这样的组合键产生中断信号SIGINT来终止程序运行。在gdb之外,这将终止你的程序。而Gdb将跟踪这个信号,并停止程序的执行。同样的,通过断点,你可以在任意一行代码或者函数调用处停止程序运行。一旦你的程序停止,你可以查看你的程序运行到了哪里,查看当前范围的变量值,以及内存空间、cpu寄存器等。你也可以改变变量或者内存,来观察对程序有什么影响。
2.1 如何停止执行?你能够通过向你的程序发送类似于SIGINT的信号来停止程序执行。这是通过CTRL+C组合键实现的。在下面的例子中,程序运行后,我按下了CTRL+C组合键。
(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)
2.2如何继续执行?对于在任何时间停止的程序,使用continue命令重新执行之。
2.3如何查看程序在何处停止?使用list命令使得gdb打印出程序停止处之上以及其下部分的代码。在下面的例子中,断点位于第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 }
2.4如何逐行单步执行代码?首先,通过发送信号或者使用断点停止程序的运行。然后,使用next和step命令。
5 while(1){
(gdb) next
7 }
(gdb)
注意:next与step命令是不同的。在一个为函数调用的代码行上,next将直接“越过”该函数调用到下一行代码,而step将“进入”该函数调用。
Next命令:
(gdb)
11 fun1();
(gdb) next
12 }
The step command:
(gdb)
11 fun1();
(gdb) step;
fun1 () at loop.c:5
5 return 0;
(gdb)
2.5如何检查变量?使用print命令加上变量名作为参数。例如,如果你有int x和 char *s:
(gdb) print x
$1 = 900
(gdb) print s
$3 = 0x8048470 "Hello World!\n"
(gdb)
注意:print命令的输出总是$## = (value)的形式。其中$##是一个简单的计数器,用以跟踪已经检查过的变量。
2.6如何修改变量?使用set命令加上C语言的赋值语句作为其参数。例如,改变x的值为3:
(gdb) set x = 3
(gdb) print x
$4 = 3
注意:在新版本的gdb中,可能需要使用命令“set var”,在上例中应当为“set var x=3”。
2.7如何调用链接进程序的函数?在调试器的命令行上,你可以使用call命令来调用任何链接进成粗的函数。这包括你自己的代码以及标准函数库。例如,如果你想导出程序的dump core:
(gdb) call abort()
2.8如何从一个函数返回?使用finish命令来完成函数的执行,并返回到调用者。该命令也将显示该函数的返回值。
(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