1

我使用分配工具来测量我的 iOS 应用程序中的堆使用情况。我发现在标签名称为“Memory Tag 70”的区域中分配了大量内存,我想知道谁对此负责,所以我可以追查:

  • 我是否适合尝试对这段记忆做任何事情
  • 如果是这样,我应该怎么做(即什么代码在该区域分配对象)。

那么,我可以追踪OSMalloc_tagAlloc()带有特定参数的调用来自哪里吗?我愿意接受我可能只能在模拟器中运行时才能这样做,而不是在设备上。但即使是这样,我该怎么办呢?我可以dtrace显示标签名称吗?如果可以,我可以通过在模拟器中启动我的应用程序dtrace -c吗?如何?

4

2 回答 2

0

对我来说,这个标签与我分配的大 UIImages 有关。我做了一些调查,以了解如何获得更多关于此的信息并提出一些(也许)有用的建议。

我相信您感兴趣的标签是通过 vm_allocate 和类似的标志参数传递的标签,而不是 OSMalloc_tagAlloc()。iOS 3.1 发行说明提到了与 VM 仪器相关的 <mach/vm_statistics.h> 和 <mach/vm_map.h> 标头。

我认为标签是通过 vm_allocate flags 参数根据 vm_statistics.h 的 VM_FLAGS_ALIAS_MASK 并遵循#defines 传递的。(它们在这里被称为“别名”。)这意味着您应该能够制作一个 dtrace 脚本来探测 vm_allocate 并从 flags 参数中提取标签。例如:

sudo dtrace -n 'fbt:mach_kernel:vm_allocate:entry /pid==12345/ { printf("%d", (arg3 & 0xFF000000) >> 24); }'

您可以使用 Instruments 制作 dtrace 仪器并通过“Instrument”菜单中的“Build New Instrument...”在 iOS 模拟器上运行,或者您可以使用命令行 dtrace 脚本并包含 /pid == 123456 / 谓词为您正在运行的应用程序。

不幸的是,我未能找到正确的探测器来找到这些分配。检查适当的 argN 变量时,标记/别名部分中的标志似乎始终为 0。例如,我尝试了上面的 fbt:mach_kernel:vm_allocate、fbt:mach_kernel:mach_vm_allocate、fbt:mach_kernel:vm_map_enter 等。也许这些分配正在通过其他途径?我对内核的内存分配系统了解不多。

所以,我不确定这些标签是在哪里传递给内核的,但我希望这能帮助你追踪它。

于 2011-01-11T14:02:27.993 回答
0

在仪器中,您可以通过选择位于窗口顶部和底部之间的分隔符中的弹出窗口在各种显示之间切换。对于“分配”,您可以将其切换为显示“调用树”(我认为它默认为“统计”)。

这应该为您提供所有分配的调用堆栈。但是,我不确定它是否会从内核一直跟踪到用户空间。

于 2011-01-06T00:45:31.970 回答