在检查内存时,gdb如何同时显示十六进制和ascii?

在检查内存时,gdb如何同时显示十六进制和ascii?,gdb,Gdb,使用x/100c时,输出同时显示ascii和十进制 0x111111:40'('40'(' gdb如何同时显示ascii和十六进制 像 0x111111:0x28'C'0x28'C' 这种格式更好: 0x111111:0x28 0x28…“CC…”不幸的是,没有内置方式。我认为这将是对gdb的一个很好的添加 同时,您可以使用Python编写一个新的转储命令来实现自己的转储。我认为这并不难。您可以使用宏来实现这一点。遍历字符,并调用适当的printfs define xac dont-r

使用x/100c时,输出同时显示ascii和十进制

0x111111:40'('40'('

gdb如何同时显示ascii和十六进制

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

这种格式更好:


0x111111:0x28 0x28…“CC…”

不幸的是,没有内置方式。我认为这将是对gdb的一个很好的添加


同时,您可以使用Python编写一个新的转储命令来实现自己的转储。我认为这并不难。

您可以使用宏来实现这一点。遍历字符,并调用适当的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
定义xac
不要重复
设置$addr=(字符*)($arg0)
设置$endaddr=$addr+$arg1
而$addr<$endaddr
printf“%p:”,$addr
设置$lineendaddr=$addr+8
如果$lineendaddr>$endaddr
设置$lineendaddr=$endaddr
结束
设置$a=$addr
而$a<$lineendaddr
printf“0x%02x”,*(未签名字符*)$a
一美元一套++
结束
printf“'”
设置$a=$addr
而$a<$lineendaddr
printf“%c”,*(字符*)$a
一美元一套++
结束
printf“'\n”
设置$addr=$addr+8
结束
结束
文件xac
用法:xac地址计数
结束

$gdb二氧化碳
(gdb)清单
1#包括
2#包括
3.
4主要内容()
5       {
6个字符[50];
7.
8 sprintf(cmd,“cat/proc/%d/maps”,getpid());
9系统(cmd);
10      }
(gdb)中断9
0x400666处的断点1:文件co2.c,第9行。
(gdb)运行
断点1,co2处的main().c:9
9系统(cmd);
(gdb)xac cmd 20
0x7FFFFFE110:0x63 0x61 0x74 0x20 0x2f 0x70 0x72 0x6f“cat/pro”
0x7FFFFFE118:0x63 0x2f 0x32 0x30 0x37 0x37 0x38 0x2f'c/20778/'
0x7FFFFFE120:0x6d 0x61 0x70 0x73“映射”
定义xac2
不要重复
设置$addr=(字符*)($arg0)
设置$endaddr=$addr+$arg1
而$addr<$endaddr
printf“%p:”,$addr
设置$lineendaddr=$addr+8
如果$lineendaddr>$endaddr
设置$lineendaddr=$endaddr
结束
设置$a=$addr
而$a<$lineendaddr
printf“0x%02x”,*(未签名字符*)$a
一美元一套++
结束
printf“'”
设置$a=$addr
而$a<$lineendaddr
printf“%c”,*(char*)$a<32 | |*(char*)$a>126?。:*(char*)$a
一美元一套++
结束
printf“'\n”
设置$addr=$addr+8
结束
结束

上面的宏处理不可打印的ASCII字符。在Mark Plotnick给出的xac宏代码中只修改了1行。由于我没有必要的声誉,所以无法将其作为注释提及,因此作为另一个答案发布。

如何将此宏加载到gdb?@0x64将其放入一个文件中,并使用gdb类型
source/path/to/file
@0x64您也可以将其放入
~/.gdbinit
中。此文件在启动时默认来源于gdb。如果该文件不存在,则可以创建它。
$ 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'
define xac2
    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 < 32 || *(char *)$a > 126 ? '.' : *(char *)$a
            set $a++
        end
        printf "'\n"
        set $addr = $addr + 8
    end
end