1.数据断点
GDB支持数据断点的设置
watch命令用于监视变量是否被改变(本质上为硬件断点)
watch命令的用法:watch var_name
2.GDB中的内存查看
GDB中可以检查任意内存区域中的数据
命令语法: X /Nuf expression
N—需要打印的单元数
u—每个单元的大小,即打印单元的单位
f—数据打印的格式
示例:
X / 4bx 0x804a024
4表示打印的单元数目
b:表示bytes
x:16进制
X命令中参数u对应的单位:
格式 打印方式
b 单字节
h 双字节
w 四字节
g 八字节
GDB中的打印格式:
格式 打印方式
x 16进制
d 有符号10进制
u 无符号10进制
o 8进制
t 2进制
a 地址
c 字符
f 浮点数
示例1:判断系统的大小端
(gdb) set var = 1
(gdb) print /a &var
$1 = 0x804a024<var>
(gdb) X / 4bx 0x804a024
0x804a024<var> : 0x01 0x00 0x00 0x00
(gdb) X/ 1bx 0x804a024
0x804a024<var> : 0x01
示例2:
int g_var = 0;
void* thread_func(void* args)
{
sleep(5);
g_var = 1;
}
int main()
{
int i=0;
pthread_t tid = 0; //定义线程tid的变量
pthread_create(&tid,NULL,thread_func,NULL); //创建线程,线程的执行体在thread_func中
for(int i =0; i<10; i++)
{
printf("g_var = %d/n",g_var);
sleep(1);
}
}
实际产片开发,一般都是多线程的形式,在多线程进行交互时,难免的可能意外的改写某个全局变量,上面的例子就是模拟这种情况。
首先编译:gcc -g -lpthread test.c -o test.out
gdb test.out
start //启动可执行程序
(gdb) watch g_var //使用watch设置数据断点
会有提示:Hardware watchpoint 2 : g_var (硬件断点设置到了g_var这个变量上)
(gdb) info breakpoints
(gdb) continue