gpt4 book ai didi

python - 在 lldb Python 脚本中取消引用类型为 void * 的 SBValue

转载 作者:太空宇宙 更新时间:2023-11-03 18:34:59 26 4
gpt4 key购买 nike

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

我正在尝试编写一个与 lldb 一起使用的 Python 脚本,它允许我打印出由 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;
}

打印 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

但是我如何访问voidPointer指向的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 session :

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

关于python - 在 lldb Python 脚本中取消引用类型为 void * 的 SBValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com