各位看官们,大家好,上一回中我们说的是GDB修改程序运行环境的功能,并且说了如何使用GDB修改变量
的值。这一回中,我们继续介绍GDB的调试功能:监视功能。当然了,我们也会介绍如何使用GDB的监视功
能。闲话休提,言归正转。让我们一起talk GDB吧!
我们说的监视类似像电影中描述的哪种监视,只不过电影中的被监视对象通常是一些犯罪嫌疑人,而我们
的监视对象是运行着的程序,更具体点说,是程序中的存储单元地址。GDB提供了监视功能,首先设置一个
监视点,GDB会自动监视该监视点上的变化了,如果监视点发生了变化,GDB就会在监视点哪里停下来,这
时候,我们就能看到是谁让监视点发生了变化。我来总结一下具体的步骤:
1.设置一个监视点。例子:watch giVal 该例子表示在giVal所在的存储单元哪里设置一个监视点。
2.先使用start命令开始调试,当有程序修改监视点的存储单元时它就会停下来。
3.使用c命令会再次运行程序,直到有程序操作观察点监视的存储单元时再次停下来。
光说不练,不是我们的风格,接下来,我们用具体的例子来说明如何使用监视功能。
#include<stdio.h> int g; void fun() { g = 3; } int main() { int a,b; a = 3; b = 5; g = a+b; printf("a+b = %d \n",g); fun(); printf("a+b = %d \n",g); return 0; }
1.编写程序。打开VIM,输入上面的程序,并且保存到m.c文件中
2.编译程序。在终端中输入:gcc -g m.c -o s
3.运行程序。在终端中输入:./s ,得到以下运行结果:
./s
a+b = 8
a+b = 3
大家可以看到程序中a=3,b=5,a+b=8这是小学生也会的数字呀,可是程序第一次输出运算结果时还正确,
第二次输出运算结果时就不正确了,这是怎么回事?看官莫急,我们使用GDB的监视功能来调试一下,很
快就能知道。谁修改了这个全局变量。
在终端中输入:gdb s //使用GDB调试程序
(gdb) watch g
//设置一个监视点,监视全局变量g
Hardware watchpoint 1: g
(gdb) start //开始调试
Temporary breakpoint 2 at 0x8048435: file m.c, line 13.
Starting program: xxx/s
Temporary breakpoint 2, main () at m.c:13
13 a = 3;
(gdb) c
//继续调试程序,直到监视点g发生变化
Continuing.
Hardware watchpoint 1: g
Old value = 0 //这里显示监视点发生了变化,并且列出了变化前后的值
New value = 8 //这时的运算结果是正确的
main () at m.c:17
17 printf("a+b = %d \n",g);
(gdb) c
//运算结果正确,继续调试程序,直到监视点g发生变化
Continuing.
a+b = 8
Hardware watchpoint 1: g
Old value = 8 //这里显示监视点发生了变化,并且列出了变化前后的值
New value = 3 //g的值从8变成了3
fun () at m.c:8
//提示程序中第8行
8 }
(gdb) list 8 //观看程序中第8行的内容
3 int g;
4
5 void fun()
6 {
7 g = 3;
//大家看到了吧,原来是fun函数修改了g的值。
8 }
9
10 int main()
11 {
12 int a,b;
(gdb) stop //结束调试
我们通过这个例子说明了如何在调试过程中使用监视功能来调试程序,并且找出了发生错误的原因。不过
该例子比较简单,我们仔细观察一下程序就能发现是fun函数修改了运算结果。在实际的程序中,就不会
像例子中这么简单了,希望看官们能够举一反三,灵活使用监视功能调试程序。
监视功能也是GDB中一个十分强大的功能,在调试全局变量被修改,或者数组越界错误非常有用。会C语言
的看官们都知道,全局变量是C程序中一个十分让人头疼的东西,在有些程序中甚至不允许使用全局变量,
使用GDB的监视功能可以监视全局变量的一举一动,只要全局变量发生了变化,它就会停止下来。因此可
以把监视功能看作是全局变量的克星。
看官们,关于GDB的内容,今天咱们就说到这里。欲知后事如何,且听下回分解!
版权声明:本文为博主原创文章,未经博主允许不得转载。