在gdb中格式化数据的二进制表示形式

在gdb中格式化数据的二进制表示形式,gdb,Gdb,这些天我经常使用gdb的检查内存特性。然而,我发现数据的二进制表示不是很可读,因为所有的位都被压缩在一起。我想添加一些空格以使其更具可读性,因此,例如,我将使用0110-1100-0110-0100-1000或类似内容,而不是0110-1100-0110-1100-0110-0101-0100-1000 这可能吗?我得到的最接近的是x/4bts,这很接近,但仍然存在两个问题:数据以字节(8位而不是4位)进行分组,字节以相反的方式排列(因此它的01001000 011001001 01100110

这些天我经常使用gdb的检查内存特性。然而,我发现数据的二进制表示不是很可读,因为所有的位都被压缩在一起。我想添加一些空格以使其更具可读性,因此,例如,我将使用
0110-1100-0110-0100-1000
或类似内容,而不是
0110-1100-0110-1100-0110-0101-0100-1000

这可能吗?我得到的最接近的是
x/4bts
,这很接近,但仍然存在两个问题:数据以字节(8位而不是4位)进行分组,字节以相反的方式排列(因此它的
01001000 011001001 011001100


谢谢

您需要的是类似于GDB的漂亮打印机的东西,它们最常用于打印STL/链表等。可能已经有一些解决方案可以满足您的需要,所以谷歌有点适合漂亮打印机

下面的脚本只是一个示例,说明了如何使用python扩展编写自定义命令,这将适用于GDB 7.3版和更高版本,但我在7.5版中对其进行了测试

import gdb

class ppbin(gdb.Command):
    def __init__(self):
        super(ppbin, self).__init__("ppbin", gdb.COMMAND_USER)

    def invoke(self, arg, tty):
        print arg

        arg_list = gdb.string_to_argv(arg)

        if len(arg_list) < 2:
            print "usage: <address>, <byte-count>"
            return
        res = gdb.execute("x/%sxt %s" %(arg_list[1], arg_list[0]), False, True)
        res = res.split("\t")
        ii = 0
        for bv in res:
            if ii % 4:
                print "%s-%s-%s-%s-%s-%s-%s-%s" %(bv[0:4],   bv[4:8],
                                                  bv[8:12],  bv[12:16], \
                                                  bv[16:20], bv[20:24], \
                                                  bv[24:28],bv[28:32])
            ii += 1

ppbin()
以上代码是共享的


另外,我通常发现用十六进制(x命令)调试内存比二进制容易,所以我不会使用我的解决方案。

您的GDB版本是什么?如果是7.3或更高版本,则可以使用python漂亮打印。
(gdb) source pp-bin.py 
(gdb) ppbin 0x601040 10
0x601040 10
0000-0000-1010-1010-0011-0011-0101-0101
0000-0000-0000-0000-0000-0000-0000-0000
0000-0000-0000-0000-0000-0000-0000-0000
0000-0000-0000-0000-0000-0000-0000-0000
0000-0000-0000-0000-0000-0000-0000-0000
0000-0000-0000-0000-0000-0000-0000-0000
0000-0000-0000-0000-0000-0000-0000-0000
0000-0000-0000-0000-0000-0000-0000-0000
(gdb)