c++ - 在 gdb 上格式化检查内存

标签 c++ gdb

调试 C/C++ 代码时,我使用以下命令检查内存

(gdb)x/32xub data
0x7fef824b2c6a: 8   0   39  235 101 169 0   30
0x7fef824b2c72: 73  219 25  195 8   0   69  0
0x7fef824b2c7a: 0   60  17  223 64  0   54  6
0x7fef824b2c82: 245 43  85  190 0   3   147 32

我想要连续 16 个字节,每个字节以 2 个十六进制数字显示。 不知道该怎么办。看不到来自 reference manual 的任何帮助. 有任何想法吗?谢谢。

更新1

刚刚意识到,再次执行时,它以十六进制数字显示每个字节。但是,它是每行 8 个字节,而不是 16 个。

(gdb) x/32x prevPkt
0x7fef824b2c6a: 0x08    0x00    0x27    0xeb    0x65    0xa9    0x00    0x1e
0x7fef824b2c72: 0x49    0xdb    0x19    0xc3    0x08    0x00    0x45    0x00
0x7fef824b2c7a: 0x00    0x3c    0x11    0xdf    0x40    0x00    0x36    0x06
0x7fef824b2c82: 0xf5    0x2b    0x55    0xbe    0x00    0x03    0x93    0x20

最佳答案

您可以使用宏来完成此操作。 (这是改编 self 对 a similar question 的回答)。

define xb16
    dont-repeat
    set $addr = (char *)($arg0)
    set $endaddr = $addr + $arg1
    while $addr < $endaddr
        printf "%p: ", $addr
        set $lineendaddr = $addr + 16
        if $lineendaddr > $endaddr
            set $lineendaddr = $endaddr
        end
        set $a = $addr
        while $a < $lineendaddr
            printf "0x%02x ", *(unsigned char *)$a
            set $a++
        end
        printf "\n"
        set $addr = $addr + 16
    end
end

document xb16
usage: xb16 address count
outputs bytes in hex, 16 per row
end

关于c++ - 在 gdb 上格式化检查内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31442407/

相关文章:

c++ - visual c++ <limits> 常量的多个定义

c - 为什么调用函数会修改参数中未给出的指向函数的指针数组的值?

c - eclipse CDT : Dynamic Printf feature not working

gdb - "Missing separate debuginfos"在非 root 帐户中

c++ - 为什么循环中的 itr = vector.erase(itr) 导致内存损坏?我在这里做错了什么吗?

c++ - 实现一个指向可变大小结构的指针

c++ - WIX C++ 自定义操作

linux - 为什么 GDB 以小数形式输出内存?

c++ - 在 Embarcadero Tools API 中的光标位置插入文本

c++ - 无法理解指向固定大小数组的指针