在检查内存时,gdb如何显示十六进制和ASCII码? [英] How can gdb show both hex and ascii when examing memory?

查看:1234
本文介绍了在检查内存时,gdb如何显示十六进制和ASCII码?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



0x111111:40'('40'(')使用x / 100c时,输出显示ascii和decimal。 / code>



gdb如何同时显示ascii和hex?

0x111111:0x28'C'0x28'C'



这种格式更好:

0x111111:0x28 0x28 ...'CC ...'

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

set $ addr = $ addr + 8
end
end

文件xac
用法:xac地址计数
结束



  $ gdb co2 
(gdb)list
1 #include< stdlib.h>
2 #include< stdio.h>
3
4 main()
5 {
6 char cmd [50];
7
8 sprintf(cmd,cat / proc /%d / maps,getpid());
9系统(cmd);
10}
(gdb)break 9
断点1在0x400666:文件co2.c,第9行。
(gdb)run
断点1,main()在co2.c:9
9系统(cmd);
(gdb)xac cmd 20
0x7fffffffe110:0x63 0x61 0x74 0x20 0x2f 0x70 0x72 0x6f'cat / pro'
0x7fffffffe118:0x63 0x2f 0x32 0x30 0x37 0x37 0x38 0x2f'c / 20778 /'
0x7fffffffe120:0x6d 0x61 0x70 0x73'maps'


When using x/100c, the output shows the both ascii and decimal.

0x111111: 40 '(' 40 '('

How can gdb show the ascii and hex at the same time ?

like

0x111111: 0x28 'C' 0x28 'C'

This format is better:

0x111111: 0x28 0x28 ... 'CC...'

解决方案

You can do this with a macro. Iterate through the characters, and call appropriate printfs.

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

document xac
usage: xac address count
end


$ gdb co2
(gdb) list
1       #include <stdlib.h>
2       #include <stdio.h>
3
4       main()
5       {
6               char cmd[50];
7
8               sprintf(cmd, "cat /proc/%d/maps", getpid());
9               system(cmd);
10      }
(gdb) break 9
Breakpoint 1 at 0x400666: file co2.c, line 9.
(gdb) run
Breakpoint 1, main () at co2.c:9
9               system(cmd);
(gdb) xac cmd 20
0x7fffffffe110: 0x63 0x61 0x74 0x20 0x2f 0x70 0x72 0x6f 'cat /pro'
0x7fffffffe118: 0x63 0x2f 0x32 0x30 0x37 0x37 0x38 0x2f 'c/20778/'
0x7fffffffe120: 0x6d 0x61 0x70 0x73 'maps'

这篇关于在检查内存时,gdb如何显示十六进制和ASCII码?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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