zoukankan      html  css  js  c++  java
  • 数据断点

    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

  • 相关阅读:
    在python3中如何加载静态文件详版步骤
    django 过滤器总结
    通过虚拟环境创建并开始一个django
    关于django中模板的理解
    python 初学 正则表达式入门
    python 初学 错误类型以及编码规范
    获取地址的经纬度,根据经纬度反查地址
    mybatisz中一个可以替代between..and 的技巧
    linux指令和文件系统
    auto.js入门笔记
  • 原文地址:https://www.cnblogs.com/-glb/p/12545902.html
Copyright © 2011-2022 走看看