[英]An equivalent to python gdb.execute('...') in lldb
如果我有這樣的結構(在 C 中)
typedef struct {
int x;
int[2] y;
} A;
和它的一個實例,說a
與ax=1
和ay={2,3}
。
要從 python 腳本訪問ay[1]
,我真的必須執行這個非常繁瑣的命令嗎?
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])ay
但我是在問一般情況。)
我不完全確定你想在這里做什么。 我會回答幾個潛在的問題,你可以告訴我其中一個是否正確......
如果您想找到一種更好的方法來訪問已知的嵌套結構,這可能更方便:
var = lldb.frame.FindVariable("a").GetValueForExpressionPath("y[0]")
如果您要嘗試在 Python 腳本中運行命令行命令,則有兩種方法可以執行此操作:
lldb.debugger.HandleCommand("command")
那只是運行命令,並將結果打印到 lldb 的標准輸出,或者:
ret_val = lldb.SBCommandReturnObject()
lldb.debugger.GetCommandInterpreter().HandleCommand("command", ret_val)
這將運行命令,並將命令的結果(這是 lldb 驅動程序在命令運行時打印的內容)返回到ret_val
對象中。 如果您想檢查命令的結果,這很方便。 ReturnObject 還會告訴您命令是否成功,如果不成功則保留錯誤。
如果您嘗試打印靜態分配的數組 - 如您的示例中所示 - 您不需要執行上面顯示的強制轉換,您應該能夠執行以下操作:
(lldb) 支付
這應該打印所有元素。 如果您正在處理動態大小的數組(例如,您指向 malloc 數組的 int *),Xcode 8.0 中的parray
有一個新命令parray
可以讓您說:
(lldb) parray 10 是
打印 y 指向的整數數組的 10 個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.