gdb在检查内存时如何显示十六进制和ASCII码?
问题描述:
使用x/100c时,输出显示ascii和decimal。gdb在检查内存时如何显示十六进制和ASCII码?
0x111111: 40 '(' 40 '('
如何用gdb显示在同一时间ASCII和十六进制?
像
0x111111: 0x28 'C' 0x28 'C'
这种格式是更好:
0x111111: 0x28 0x28 ... 'CC...'
答
不幸的是没有内置的方法。我认为这将是gdb的一个很好的补充。
同时,您可以通过在Python中编写新的转储命令来编译自己的代码。我认为这不会很难。
答
你可以用宏来做到这一点。遍历字符,并调用适当的printf。
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'
你是这样的神! – jinleileiking 2014-09-16 06:41:44
那很酷 – JSmyth 2015-04-27 16:54:44