编写Python脚本在lldb中打印rec数组

2024-10-04 01:34:52 发布

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

我需要有关在lldbPython模块中使用的SBValue class的帮助,该模块用于为lldb调试会话创建脚本。在

我正在将kext测试和调试系统从gdb移植到lldb,这样我就可以开始使用Xcode和{}的最新版本。这个过程的一部分是用python重写gdb调试脚本,以便它们可以与lldb一起使用。在

我有两个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版本经常崩溃。在


Tags: 模块import脚本com记录数组resultdebugger
1条回答
网友
1楼 · 发布于 2024-10-04 01:34:52

您正在寻找SBValue::GetChildAtIndex(),但需要使用该API的长形式。例如,对于一个独立的用户进程C文件

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
typedef struct
{
    int datum;
} TraceRec;

typedef struct
{
        uint32_t fMaxNumberEntries;
        uint32_t fNextEntryNumber;
        TraceRec *fTraceRecArray;
} com_softraid_TraceLog;

com_softraid_TraceLog *com_softraid_gTraceLogPtr;

int main ()
{
    com_softraid_TraceLog log;
    com_softraid_gTraceLogPtr = &log;
    log.fTraceRecArray = (TraceRec *) malloc (sizeof (TraceRec) * 100);
    log.fMaxNumberEntries = 100;
    log.fNextEntryNumber = 4;
    log.fTraceRecArray[0].datum = 0;
    log.fTraceRecArray[1].datum = 1;
    log.fTraceRecArray[2].datum = 2;
    log.fTraceRecArray[3].datum = 3;

    puts ("break here");

    return 0;
}

我们可以在交互式脚本模式下进行一些实验:

^{pr2}$

还有一个SBValue::GetPointeeData(),它会给你一个SBData对象中每个数组成员的原始字节,但是你需要将这些字节强制回到你的结构中,这样我就不会那样做了。在

相关问题 更多 >