相当于lldb中的python gdb.execute('...')

月亮的眼睛

如果我有这样的结构(在C中)

typedef struct {
    int x;
    int[2] y;
} A;

还有一个实例,aa.x=1和来表示a.y={2,3}

要从a.y[1]python脚本访问,实际上我是否必须执行此非常麻烦的命令?

script print lldb.frame.FindVariable('a').GetChildMemberWithName('y').GetChildAtIndex(1)

当我想在C中打印结构变量的成员时,我已经编写了此函数来帮助我:

# lldb_cmds.py

import lldb

def get_nested_val_c(vnames,idx=None):
    """
        vnames is a list of strings ['a','b','c',...] that will be evaluated as if
        you called

            a.b.c.,...

        So for [a,b,c] you get:

            a.b.c

        If idx is given, it is evaluated as

            a.b.c[idx]

    """

    try:
        x=lldb.frame.FindVariable(vnames[0])
        for v_ in vnames[1:]:
            x=x.GetChildMemberWithName(v_)
    except TypeError:
        x=lldb.frame.FindVariable(vnames)

    if idx == None:
        return x

    try:
        x=x.GetChildAtIndex(idx[0])
        for i_ in idx[1:]:
            x=x.GetChildAtIndex(i_,False,True)
    except TypeError:
        x=x.GetChildAtIndex(idx)

然后可以加载

command script import lldb_cmds.py

并称为(如上)

python lldb_cmds.get_nested_val_c[['a','y'],1)

但是,有没有更短的方法呢?是的,我知道你会写

p a.y[1]

但是,由于lldb中似乎没有while循环,我该如何使用变量索引打印该循环而无需求助于如此长的语句?

(是的,我知道您可以为这个示例写信:p *(int(*)[2])a.y但是我总体上是在问。)

吉姆·英厄姆(Jim Ingham)

我不确定您要在这里做什么。我会回答几个潜在的问题,您可以告诉我其中一个是否正确...

如果您试图找到一种更好的方法来访问已知的嵌套结构,这可能会更方便:

var = lldb.frame.FindVariable("a").GetValueForExpressionPath("y[0]")

如果要执行的操作是在Python脚本中运行命令行命令,则有两种方法可以执行此操作:

lldb.debugger.HandleCommand("command")

只需运行命令,然后将结果打印到lldb的stdout,或:

ret_val = lldb.SBCommandReturnObject()
lldb.debugger.GetCommandInterpreter().HandleCommand("command", ret_val)

这将运行命令,并将命令的结果(这是命令运行时在lldb驱动程序中显示的结果)返回到ret_val对象中。如果要检查命令的结果,这很方便。ReturnObject还会告诉您命令是否成功,如果错误则保存错误。

如果您尝试打印静态分配的数组(如您的示例中所示),则无需执行上面显示的强制类型转换,则应该能够执行以下操作:

(lldb)p ay

并且应该打印所有元素。如果您要处理动态大小的数组(例如,指向一个malloc数组的int *),则Xcode 8.0中的lldb会提供一个新命令parray,该命令可以让您说:

(lldb)parray 10 ay

打印y指向的int数组的10个元素。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

相当于“ debugger”的铬,在Cygwin的“ gdb”上?

来自分类Dev

gdb相当于java eclipse“拖放到框架”

来自分类Dev

在Julia中相当于Python的“ with”吗?

来自分类常见问题

相当于JavaScript中的Python Pandas

来自分类Dev

相当于Python中的MATLAB ksdensity

来自分类Dev

相当于python中的GOTO

来自分类Dev

相当于Python 3中的coerce()

来自分类Dev

相当于Matlab在Python中

来自分类Dev

相当于MATLAB中的mxCreateDoubleMatrix的python

来自分类Dev

相当于python中bash的/*.txt

来自分类Dev

是否有相当于 gdbserver 的 lldb?

来自分类Dev

How to execute a GDB command from a string variable?

来自分类Dev

相当于〜/ .bashrc的Python

来自分类Dev

相当于HashMap的Python

来自分类Dev

相当于bwmorph的Python

来自分类Dev

“===”相当于在Java中

来自分类Dev

相当于Python 2中心的Python 3

来自分类Dev

Matlab相当于python中的点星

来自分类Dev

在Python Tornado中相当于jquery $ .when

来自分类Dev

相当于Python中“值错误”的C#

来自分类Dev

在Rust中相当于Python的subprocess.communicate吗?

来自分类Dev

相当于Python中的Swift完成块?

来自分类Dev

Perl相当于Python中的一组工人

来自分类Dev

相当于普通python中的Ipython run命令

来自分类Dev

C#相当于Python中的Rjust

来自分类Dev

相当于javascript或nodejs中Python的help()

来自分类Dev

在Python sklearn中相当于Matlab的PCA

来自分类Dev

相当于诗歌中的“ python setup.py development”

来自分类Dev

相当于python中Matlab的ti = 1:step:len