• gdb调试器—常用知识(一)


    gdb内存监控

    gdb watch 内存监控

    gdb的watch的内存功能,使用场景一般是发现的情况,要查清楚一块内存被谁给踩了,我们直接使用watch 监控它就可以了。

    • watch *(int*)内存地址: 当监控的内存的内容发生变化(即写操作)时,程序停止运行。
    • rwatch *(int*)内存地址: 当监控的内存的内容发生读操作时, 程序停止运行。
    • awatch *(int*)内存地址: 当监控的内存被读或被写时,程序停止运行。

    当你们监控全局变量时,可以直接使用watch 全局变量名的方法。

    使用系统库mprotect API 进行内存保护

    函数说明: int mprotect(void* addr, size_t len, int prot);
    - 参数1, addr需要页对齐
    - 参数2, len需要页大小的倍数
    - 参数3,prot表示模式,取值为几种枚举值的或操作:PROT_NONE(0, 不能请问)/PROT_READ(1, 可读)/PROT_WRITE(2, 可写)/PROT_EXEC(4, 可执行)

    该函数的使用场景是:有代码中申请了一个大内存(大于4K),这块内存很少修改或者不修改,例如一些配置数据等。 如果代码执行过程中发现该块内存被踩,但是具体的地址不能确定,这时就可以使用该函数这块内存保护起来。

    使用系统库 perf_event 数据断点 API 进行内存保护

    暂时没有使用过。

    perf_evnt是内核对用户态提供软硬件性能数据的一个统一接口,用户通过perf_event可以获取到各种性能数据。用户态的函数接口为:

    int perf_vent_open(struct perf_event_attr* attr, pid_t pid, int cpu, int group_fd, unsigned_long

    gdb中使用x命令查看内存的内容

    x 命令说明

    Examine memory, 使用格式为:x/FMT ADDRESS, 其中FMT中三部分组成:[count][format][size].(format与size的参数位置可以互换)

    例如: x/10xw &a, 查看从&a开始的连续10 * 4 个字节的内存,以十六进制显示出来。

    • count: 表示重复查看的数目,也就是一次性要看多少单位的内存。

    • format 表示要显示的格式, 如以下几种:

      format 含义
      o octal, 即八进制
      x hex, 十六进制
      d decimal, 十进制
      u unsigned decimal
      t binary, 二进制
      f float, 符号数
      a address, 地址的形式
      c char类型
      s string
      z hes, zero padded on the left
    • Size: 表示每一次显示的单位大小。有以下几种:

      Size 含义
      b byte, 一个字节大小
      h half word, 半个字大小,2个字节
      w word, 一个字大小,4个字节
      g giant, 8个字节

    举例

    例如变量a的地址开始的4*4个字节长度的内容:

    (gdb) p &a
    $2 = (int *) 0x7fffffffe17c
    (gdb) x/4xw 0x7fffffffe17c
    0x7fffffffe17c:	0x00000001	0x55555310	0x00005555	0xf7af809b
    (gdb) x/4i 0x7fffffffe17c
       0x7fffffffe17c:	add    %eax,(%rax)
       0x7fffffffe17e:	add    %al,(%rax)
       0x7fffffffe180:	adc    %dl,0x55(%rbx)
       0x7fffffffe183:	push   %rbp
    
    
  • 相关阅读:
    Vue3 模板语法
    Vue 起步
    [原创]CPA、CPC、CPM、CVR、CTR和ROI分别代表什么?
    Redis 线程模型
    BIO和NIO区别以及原理
    kafka简介&kafka安装
    python测试开发django-109.ModelForm模型表单的使用
    HttpRunner2.X 版本和 3.X 版本的区别到底有哪些?(吐血总结!)
    python测试开发django-108.form组件Select下拉框读取数据库内容
    DDD领域驱动设计架构模式:防腐层(Anti-corruption layer)
  • 原文地址:https://www.cnblogs.com/yinheyi/p/14729803.html
Copyright © 2020-2023  润新知