格式化gdb检查内存 [英] Formatting on gdb examine memory

查看:264
本文介绍了格式化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个十六进制数字。
不知道该怎么做。没有看到参考手册的任何帮助。
任何想法?感谢。


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


解决方案

您可以使用宏执行此操作。 (这是根据我对类似问题的回答进行调整的)。



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

set $ addr = $ addr + 16
结束
结束

文件xb16
用法:xb16地址计数
输出十六进制字节数,每行16个
结束


When debugging a C/C++ code, I examine memory using the following command

(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

I would like have 16 bytes in a row and each byte shows in 2 hex digits. Not sure what to do. Don't see any help from reference manual. Any ideas? Thanks.

UPDATE1

Just realized that when doing it again, it shows every bytes in hexdigits. However, it's 8 bytes per row, not 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

解决方案

You can do this with a macro. (This is adapted from my answer to 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

这篇关于格式化gdb检查内存的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆