本节我们研究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的值。