调试利器GDB(下)

本节我们研究gdb更深层的用法:

数据断点:

可以根据变量的值来监视变量。

数据断点本质是硬件断点,数量有限。

watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变了,程序运行就停止。

数据断点常常配合gdb里面的内存查看命令使用。

x是检查内存数据的命令。

上图中的意思是打印从0x804a024地址开始连续4个字节的数据,呈现格式以16进制打印。x代表16进制。

上图中/a代表打印地址。

变量断点和内存查看实验:

watch.c程序如下:

 1 #include <stdio.h>
 2 #include <pthread.h>
 3 #include <unistd.h>
 4 
 5 int g_var = 0;
 6 
 7 void* thread_func(void* args)
 8 {
 9     sleep(5);
10     
11     g_var = 1;
12 }
13 
14 int main()
15 {
16     int i = 0;
17     pthread_t tid = 0;
18     
19     pthread_create(&tid, NULL, thread_func, NULL);
20     
21     for(i=0; i<10; i++)
22     {
23         printf("g_var = %d\n", g_var);
24         
25         sleep(1);
26     }
27 }

 先编译运行一下:

子线程中将g_var的值改为1,影响到了主线程的工作,我们认为这是一个错误的程序,进行debug调试。

开始调试:

 使用watch监视g_var:

continue继续执行程序:

当g_var被改变的时候,程序停下了。图中提示g_var的值被改写了,是被thread_func函数中的第12行改写的(gdb表达的意思是程序执行到第12行时,g_var的值被改写了,意味着是第11行改写的)。

查看内存的值:

上图也验证了当前系统是小端系统。

继续执行:

本次调试,我们确定了是什么地方修改了g_var的值。

 

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9821349.html
今日推荐