簡體   English   中英

在lldb Python腳本中取消引用為void *類型的SBValue

[英]Dereferencing a SBValue which is of type void * in lldb Python script

這是我前一天發布的帖子中的一個問題: 編寫Python腳本以輸出lldb中的recs數組

我正在嘗試編寫與lldb配合使用的Python腳本,這將允許我打印出由void *數組指向的給定類型的記錄。 使用Jason昨天提供的Python(非常感謝您的建議),我可以獲得一個SBValue對象,其中包含數組中每個成員的void *

現在,我不知道如何創建一個新的SBValue對象,該對象表示從包含空*的SBValue對象開始的記錄。 在下面的代碼中,我創建一個void *的數組,每個數組都指向一個TraceRec記錄。

在下面的Python中,我嘗試創建一個SBValue對象,該對象包含一個給定SBValue對象的TraceRec ,該SBValue對象包含數組中的元素之一(類型為void * )。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct
{
    int datum;
} TraceRec;

typedef struct
{
    uint32_t fMaxNumberEntries;
    uint32_t fNextEntryNumber;
    void ** fPointerArray;
} com_softraid_TraceLog;

com_softraid_TraceLog *com_softraid_gTraceLogPtr;

int main ()
{
    com_softraid_TraceLog log;
    TraceRec * traceRecArray;

    traceRecArray = (TraceRec *) malloc (sizeof (TraceRec) * 100);

    traceRecArray[0].datum = 0;
    traceRecArray[1].datum = 1;
    traceRecArray[2].datum = 2;
    traceRecArray[3].datum = 3;

    com_softraid_gTraceLogPtr = &log;
    log.fMaxNumberEntries = 100;
    log.fNextEntryNumber = 4;

    log.fPointerArray = malloc (sizeof(void *) * 100);

    for (uint32_t index = 0; index < 100; index++)
    {
        log.fPointerArray[index] = &traceRecArray[index];
    }

    puts ("break here");

    return 0;
}

打印fPointerArray中第二個元素的Python代碼是:

(lldb) br s -p break
(lldb) r
(lldb) scri
>>> debugger = lldb.debugger
>>> target = debugger.GetSelectedTarget()
>>> traceLog = target.FindFirstGlobalVariable("com_softraid_gTraceLogPtr")
>>> pointerArray = traceLog.GetChildMemberWithName("fPointerArray")
>>> voidPointer = pointerArray.GetChildAtIndex(1, lldb.eNoDynamicValues, 1)
>>> print voidPointer
(void *) [1] = 0xffffff807b602e10

但是,如何訪問TraceRec指向的voidPointer

任何為2 Mac調試設置lldb的人的注釋:您需要配置一些設置才能使lldb正確加載符號。 我使用以下文件初始化lldb(主目錄中的文件名= .lldb_init ):

settings set target.load-script-from-symbol-file true

#   Load the symbols for all the kexts
settings set plugin.dynamic-loader.darwin-kernel.load-kexts true

#   Load the symbols from the kext being developed (from /R2D2/syms)
settings set platform.plugin.darwin-kernel.kext-directories /R2D2/syms

#   Import the Python scripts
command script import ./sr_debug_macros.py

#   Import lldb command aliases
command source ./sr_debug_macros

//  Wait for connection to the remote Mac
kdp-remote 10.0.1.15

我在終端中使用以下命令啟動lldb會話:

xcrun lldb -s lldb_init

SBTarget::FindFirstTypeSBValue::Cast

>>> print target.FindFirstType("TraceRec").GetPointerType()
TraceRec *
>>> tracerec_ptr = target.FindFirstType("TraceRec").GetPointerType()

>>> print voidPointer.Cast(tracerec_ptr)
(TraceRec *) [1] = 0x0000000100103a94
>>> print voidPointer.Cast(tracerec_ptr).Dereference()
(TraceRec) *[1] = (datum = 1)

如果您有一個指向原始內存的指針並將其轉換為類型,則還有SBTarget::CreateValueFromAddress 但是在這種情況下,您將從變量的SBValue開始。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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