我需要有关在lldb
Python模块中使用的SBValue class
的帮助,该模块用于为lldb调试会话创建脚本。在
我正在将kext测试和调试系统从gdb
移植到lldb
,这样我就可以开始使用Xcode
和{
我有两个mac设置工作,可以进入lldb,并在受害者mac的内核中四处闲逛。我也可以在运行lldb会话时调用Python脚本。但我无法理解如何显示记录数组的内容。在
例如,给定一个TraceRecs
数组:
typedef struct
{
mach_timespec_t timeStamp;
thread_t thread;
TraceRecordType recordType;
char entry[kEntrySize];
} TraceRec;
保存跟踪记录数组的类
^{pr2}$以及内核中指向此类对象的全局:
extern com_softraid_TraceLog * com_softraid_gTraceLogPtr;
我可以使用下面的Python脚本来获取lldb中com_softraid gTraceLogPtr的值:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
import lldb
import commands
import optparse
import shlex
def __lldb_init_module(debugger, internal_dict):
debugger.HandleCommand('command script add -f sr_debug_macros.srtrace srtrace')
def srtrace(debugger, user_input, result, internal_dict):
"""srtrace [number_entries] dump out that number of entries, default = 0 = all entries"""
target = debugger.GetSelectedTarget()
traceLog = target.FindFirstGlobalVariable("com_softraid_gTraceLogPtr")
traceRecordArray = traceLog.GetChildMemberWithName("fTraceRecArray")
maxNumberEntries = traceLog.GetChildMemberWithName("fMaxNumberEntries").GetValueAsUnsigned()
nextEntryNumber = traceLog.GetChildMemberWithName("fNextEntryNumber").GetValueAsUnsigned()
print >>result, "SRLog Current Entry: %d, Log Size: %d" % (nextEntryNumber, maxNumberEntries)
print >>result, traceRecordArray
输出是:
(lldb) srtrace
SRLog Current Entry: 388, Log Size: 8192
(TraceRec *) fTraceRecArray = 0xffffff80a48fd000
但是我不知道如何显示数组中任何记录的字段中的值。我尝试过SBValue类中的大多数方法,但没有任何运气。在
有人知道这是怎么回事吗?任何帮助都会很好。在
附言:如果有人想让它正常工作,第一步应该是更新到Xcode5.1b5。当显示IOKit类的contents子类时,随xcode5.1b3提供的lldb版本经常崩溃。在
您正在寻找
SBValue::GetChildAtIndex()
,但需要使用该API的长形式。例如,对于一个独立的用户进程C文件我们可以在交互式脚本模式下进行一些实验:
^{pr2}$还有一个
SBValue::GetPointeeData()
,它会给你一个SBData
对象中每个数组成员的原始字节,但是你需要将这些字节强制回到你的结构中,这样我就不会那样做了。在相关问题 更多 >
编程相关推荐