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

How to create a dump of entire memory for iOS application running in debug mode in XCode

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

(lldb) memory read --outfile filename address

例如。

(lldb) memory read --outfile /tmp/mem-dump.txt --force --count 10000 0x000000010d051000

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

使用 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)
  • 在断点处停止执行应用程序

在 lldb 中 window

  • 输入:脚本

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

  • 输入:processAllMemoryRegions()

大功告成。

可以使用process.ReadMemory函数读取内存。检查上面狙击的样本。

您也可以尝试启动脚本执行:

(lldb) command script import  ~/path/to/script.py

描述here and here, ... but in my case this leads to XCode freeze. It is described here

代码在 Xcode 11.3.1.

上测试