格式化gdb检查内存

时间:2015-07-15 22:34:34

标签: 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的任何帮助。 有任何想法吗?感谢。

UPDATE1

刚刚意识到再次执行时,它会以十六进制显示每个字节。但是,它每行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

1 个答案:

答案 0 :(得分:3)

您可以使用宏执行此操作。 (这是根据我对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