【问题标题】:(gdb) p/x equivalent in gdb python script?(gdb)gdb python脚本中的p/x等价物?
【发布时间】:2013-06-05 09:35:51
【问题描述】:

主要结构是

struct my_struct 
{
   int x; 
   void* md_template;
   void* md_capture_buff;
   ....
};

当我在做的时候

(gdb) p ((struct my_struct *)dev_base->next->priv)

输出是这样的

$1 = {
 x= 15 '\017'
 md_template = ,
 md_capture_buff =
}

当我用 p/x 做的时候:

(gdb) p/x ((struct my_struct *)dev_base->next->priv)

输出是这样的

$1 = {
 x= 0xf;
 md_template =0x410027001a50 ,
 md_capture_buff = 0x41002c0c5490
}

在 gdb-python 中:

python val = gdb.parse_and_eval('((struct my_struct *)dev_base->next->priv)')

python print val

输出是:

$1 = {
 x= 15 '\017'
 md_template = ,
 md_capture_buff =
}  

那么如何在 gdb-python 中写等价于 p/x 呢?或者如何在python脚本中获取'md_capture_buff'的地址,因为python val = gdb.parse_and_eval('((struct my_struct *)dev_base->next->priv)').address没有打印地址?

【问题讨论】:

    标签: python gdb gdb-python


    【解决方案1】:

    您可能已关闭“设置打印地址”。我不会这样做的。可以说 str 运算符遵守此设置是一个错误。

    除了直接调用它之外,没有很好的方法来重现“p/x”。请参阅 gdb.execute。

    您可以使用 [] 获取任何字段的值。喜欢

    val = something['fieldname']
    

    IMO,通常使用 API 比使用 parse_and_eval 更好。也就是说,您可以直接从 Python 进行转换、查找字段等。

    【讨论】:

    • @tromey,谢谢。但是在遍历结构时,如果数组作为成员出现,那么如何以十六进制打印整个数组的值(更易读的形式)。只有p/x 才有可能。但我们不能在遍历中间使用gdb.execute('p/x <array>')。我想在这个脚本stackoverflow.com/questions/16787289/… 中实现它。请让我知道是否有办法做到这一点。我们可以像在这个脚本中完成指针一样控制打印数组吗?
    • 我试图避免使用 parse_and_eval() 但我不确定如何在没有它的情况下直接读取结构指针。假设 OP 的问题,我可以使用什么 API 来避免使用 parse_and_eval()?
    • gdb.Value 上有多种方法可供您使用。您可以使用dereference 取消引用指针,使用["fieldname"] 从结构(或指向结构的指针——通常您甚至不需要dereference)中获取字段,并使用cast改变类型。
    猜你喜欢
    • 2019-07-19
    • 2016-01-30
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-18
    • 2016-06-19
    • 2021-01-15
    相关资源
    最近更新 更多