簡體   English   中英

相當於 lldb 中的 python gdb.execute('...')

[英]An equivalent to python gdb.execute('...') in lldb

如果我有這樣的結構(在 C 中)

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

和它的一個實例,說aax=1ay={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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM