如何在 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.
上测试
我在 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.
上测试