如果我有这样的结构(在C中)
typedef struct {
int x;
int[2] y;
} A;
还有一个实例,a
用a.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
但是我总体上是在问。)
我不确定您要在这里做什么。我会回答几个潜在的问题,您可以告诉我其中一个是否正确...
如果您试图找到一种更好的方法来访问已知的嵌套结构,这可能会更方便:
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] 删除。
我来说两句