2014-09-11 489 views

回答

2

不幸的是没有内置的方法。我认为这将是gdb的一个很好的补充。

同时,您可以通过在Python中编写新的转储命令来编译自己的代码。我认为这不会很难。

3

你可以用宏来做到这一点。遍历字符,并调用适当的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' 
+0

你是这样的神! – jinleileiking 2014-09-16 06:41:44

+0

那很酷 – JSmyth 2015-04-27 16:54:44

相关问题