取消引用lldb Python scrip中void*类型的SBValue

2024-09-19 23:53:58 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我一天前发帖后的一个后续问题: Writing a Python script to print out an array of recs in lldb

我正在尝试编写一个Python脚本来与lldb一起使用,它允许我打印出由void *数组指向的给定类型的记录。使用Jason昨天提供的Python(感谢您的建议),我能够获得一个SBValue对象,该对象包含数组中每个成员的void *。在

现在我不知道如何创建一个新的SBValue对象,它表示以包含void*的SBValue对象开始的记录。在下面的代码中,我创建了一个void *数组,每个数组指向一个TraceRec记录。在

在下面的Python中,我试图创建一个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;
}

打印fpointerray中第二个元素的Python代码是:

^{pr2}$

但是我如何访问TraceRec中由^{指向的内容呢?在

对于任何为2 Mac调试设置lldb的人来说,需要配置一些设置才能使lldb正确地加载符号。我使用以下文件初始化lldb(主目录中的filename=.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

Tags: the对象comlogindexscript数组指向
1条回答
网友
1楼 · 发布于 2024-09-19 23:53:58

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开始。在

相关问题 更多 >