数据断点

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

猜你喜欢

转载自www.cnblogs.com/-glb/p/12545902.html
今日推荐