gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:05:28 30 4
gpt4 key购买 nike

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

(lldb) memory read --outfile filename address

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

,但我需要指定起始地址和内存大小。我不知道如何查找我的应用程序进行转储所占用的内存区域。是否有可能找到存储器的地址空间?也许存在其他使转储(不使用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窗口中
  • 输入:脚本
  • 导入python脚本:exec(open('/absolute/path/to/mem.py')。read())
  • 输入:processAllMemoryRegions()

  • enter image description here

    大功告成

    您可以使用 process.ReadMemory函数读取内存。检查上面剪下的 sample 。

    您也可以尝试使用以下命令启动脚本执行:
    (lldb) command script import  ~/path/to/script.py

    它描述为 herehere,...但是在我的情况下,这导致XCode卡住。描述 here

    在Xcode 11.3.1上测试过的代码。

    关于ios - 如何为在XCode中以 Debug模式运行的iOS应用程序创建整个内存转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62098874/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com