这是前一天我的帖子中的一个问题:
Writing a Python script to print out an array of recs in lldb
我正在尝试编写与lldb配合使用的Python脚本,这将允许我打印出void *
数组所指向的给定类型的记录。使用Jason昨天提供的Python(非常感谢您的建议),我能够得到一个SBValue
对象,该对象包含数组中每个成员的void *
。
现在,我不知道如何创建一个新的SBValue
对象,该对象表示从包含空*的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
但是,如何访问
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::FindFirstType
,SBValue::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
开始。