如何为在 XCode 中以调试模式运行的 iOS 应用程序创建整个内存的转储

roj*_*and 5 memory xcode dump ios lldb

我有一个在 Xcode 中以调试模式运行的应用程序。我想检查应用程序的整个内存(堆栈和堆)。我知道我可以使用 lldb 进行转储。我使用以下命令:

(lldb) memory read --outfile filename address
Run Code Online (Sandbox Code Playgroud)

例如。

(lldb) memory read --outfile /tmp/mem-dump.txt --force --count 10000 0x000000010d051000
Run Code Online (Sandbox Code Playgroud)

,但我需要指定内存的起始地址和大小。我不知道如何找到我的应用程序占用的内存区域进行转储。是否有可能找到内存的地址空间?也许存在进行转储(不使用 lldb)的其他方法?我不使用越狱设备。

roj*_*and 6

使用 lldb python 脚本桥接接口。它允许访问内存区域信息和内存数据本身,即使应用程序在物理设备上而不是在模拟器上运行。无需更改应用程序。

访问内存:

  • 将以下 python 脚本复制并保存到您的 Mac。让我们将其命名为 mem.py
import lldb

def processAllMemoryRegions():
    process = lldb.debugger.GetSelectedTarget().GetProcess()
    memoryRegionInfoList = process.GetMemoryRegions()
    numberOfMemoryRegions = memoryRegionInfoList.GetSize()
    memoryRegionIndex = 0
    while (memoryRegionIndex < numberOfMemoryRegions):
        memoryRegionInfo = lldb.SBMemoryRegionInfo()
        success = memoryRegionInfoList.GetMemoryRegionAtIndex(memoryRegionIndex, memoryRegionInfo)
        if success:
            print("Processing: "+str(memoryRegionIndex+1)+"/"+str(numberOfMemoryRegions))
            processOneMemoryRegion(process, memoryRegionInfo)
        else:
            print("Could not get memory at index: "+str(memoryRegionIndex))    
        memoryRegionIndex = memoryRegionIndex+1

def processOneMemoryRegion(process, memoryRegionInfo):
    begAddressOfMemoryRegion = memoryRegionInfo.GetRegionBase()
    endAddressOfMemoryRegion = memoryRegionInfo.GetRegionEnd()
    if memoryRegionInfo.IsReadable():
        print("Beg address of a memory region: "+stringifyMemoryAddress(begAddressOfMemoryRegion))
        print("End address of a memory region: "+stringifyMemoryAddress(endAddressOfMemoryRegion))
        error = lldb.SBError()
        regionSize = endAddressOfMemoryRegion-begAddressOfMemoryRegion
        memoryData = process.ReadMemory(begAddressOfMemoryRegion, regionSize, error)
        if error.Success():
            #do something with memoryData (bytearray) eg. save it to file
            pass
        else:
            print("Could not access memory data.")
    else:
        print("Memory region is not readable.")

def stringifyMemoryAddress(memoryAddress):
    return '0x{:016x}'.format(memoryAddress)
Run Code Online (Sandbox Code Playgroud)
  • 在断点处停止执行应用程序

在 lldb 窗口中

  • 输入:脚本

  • 导入python脚本:exec(open('/absolute/path/to/mem.py').read())

  • 输入:processAllMemoryRegions()

在此处输入图片说明

你完成了。

你可以用 process.ReadMemory函数。检查上面狙击的样本。

您还可以尝试使用以下命令启动脚本执行:

(lldb) command script import  ~/path/to/script.py
Run Code Online (Sandbox Code Playgroud)

它在此处和此处进行了描述,...但在我的情况下,这会导致 XCode 冻结。它被描述here

在 Xcode 11.3.1 上测试的代码。