对我来说,这个标签与我分配的大 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 等。也许这些分配正在通过其他途径?我对内核的内存分配系统了解不多。
所以,我不确定这些标签是在哪里传递给内核的,但我希望这能帮助你追踪它。