将Python字符串转换为GDB.Value以进行GDB漂亮打印

4
当我尝试将Python字符串作为GDB prettyprinter的子元素返回时,它会作为char数组返回。是否有办法将其作为普通字符串返回?
我有一个如下的pretty printer:
class APrinter:

    def __init__(self, val):
        self.name = "a name"
        self.age = age

    def children(self):
        yield ('name', self.name)
        yield ('age', self.age)
        yield ('address', 'this is an address')

    def display_hint(self):
        return 'array'

在这种情况下,名称和地址将作为字符数组在IDE中返回。
我还尝试将其转换为GDB值。
yield ('address', gdb.Value('this is an address'))

这里来源于API,但它返回相同的结果。

result

然而,当我将其放入to_string方法中时,它会正常打印出来,如下所示。

def to_string(self):
    return 'this is an address' 

你用的是哪个集成开发环境(IDE)?因为通常字符数组也会自动显示为字符串。 - ssbssa
@ssbssa 我在 vscodeclionkdevelop 中尝试了一下,它们都将其打印为字符数组。 - Ezike Ebuka
你可以尝试将 display_hint 从 "array" 改为 "map"。 - darcamo
@darcamo 我试过了,它没有任何作用。 - Ezike Ebuka
看起来是IDE的问题。在gdb控制台中它可以正常工作。■ 话虽如此,尝试像这样将其转换为char*gdb.Value(...).cast(gdb.lookup_type("char").pointer()) - user202729
1个回答

0

我找到了一个对我有用的解决方案,至少基于 @user202729 的想法。 然而,@user202729 最初的想法本身存在问题,因为即使我尝试在 python 中硬编码它,我的 CLion 也不会在字符串末尾有零定界符,然后调试窗口显示由于访问未终止的字符串后面的内存而导致大量错误。

要解决这个问题,您可以将 python 字符串转换为可读取的char*字符串,如下所示:

def make_char_pointer(string):
    original_bytes = string.encode("UTF-8")
    original = gdb.Value(original_bytes + b"\0", gdb.lookup_type("char").array(len(original_bytes)))
    adjusted = original.cast(gdb.lookup_type("char").pointer())
    return adjusted

我通过阅读GDB Python API文档的相关部分来到这个地方,您可以在此处找到:https://sourceware.org/gdb/onlinedocs/gdb/Python-API.html

通常的想法是您可以使用2个参数构造一个gdb.Value,第二个参数是类型,第一个参数是Python缓冲区。然后,GDB会创建该类型的新实例(在这种情况下,如果您将len评估为Python表达式,则基本上是char[len(string)+1]),并将缓冲区写入其中。现在我们将其转换为char*,BAÄM,我们完成了:D ...只花了我几个小时就能为自己的项目做到这一点...轻而易举。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接