我使用分配工具来测量iOS应用中的堆使用情况。我发现在标签名为“Memory Tag 70”的区域中分配了大量内存,我想知道谁对此负责,所以我可以追逐:
那么,我可以追踪具有特定参数的OSMalloc_tagAlloc()
调用的来源吗?我愿意接受我在模拟器中运行时可能只能这样做,而不是在设备上运行。但即使是这样,我该怎么做呢?我是否可以dtrace
向我显示标记名称,如果可以,我可以通过dtrace -c
在模拟器中启动我的应用程序吗?怎么样?
答案 0 :(得分:0)
在乐器中,您可以通过选择位于窗口顶部和底部之间的分隔符中的弹出窗口在各种显示之间切换。对于“分配”,您可以将其切换为显示“呼叫树”(我认为它默认为“统计”)。
这应该为您提供所有分配的调用堆栈。但是我不确定它是否会从内核到用户空间一直跟踪。
答案 1 :(得分:0)
对我来说,这个标签与我分配的大型UIImages有关。我做了一些调查,了解如何获得有关这方面的更多信息,并提出一些(可能)有用的建议。
我相信你感兴趣的标签是通过vm_allocate和类似的flags参数传递的标签,而不是OSMalloc_tagAlloc()。 iOS 3.1发行说明中提到了< mach / vm_statistics.h>和< mach / vm_map.h>与VM仪器连接的标头。
我认为标签是根据vm_statistics.h的VM_FLAGS_ALIAS_MASK和#defines通过vm_allocate flags参数传递的。 (它们在这里称为“别名”。)这意味着您应该能够创建一个dtrace脚本来探测vm_allocate,并从flags参数中提取标记。例如:
sudo dtrace -n 'fbt:mach_kernel:vm_allocate:entry /pid==12345/ { printf("%d", (arg3 & 0xFF000000) >> 24); }'
您可以使用Instruments制作dtrace乐器并通过“乐器”菜单中的“构建新乐器...”在iOS模拟器上运行,或者您可以使用命令行dtrace脚本并包含/ pid == 123456 /谓词为您正在运行的应用程序。
不幸的是,我找不到正确的探测器来找到这些分配是不成功的。在检查适当的argN变量时,标记/ alia部分中的标志似乎总是为0。我试过,例如,fbt:mach_kernel:vm_allocate,如上所述,fbt:mach_kernel:mach_vm_allocate,fbt:mach_kernel:vm_map_enter等等。也许这些分配正在经历其他一些途径?我对内核的内存分配系统知之甚少。
所以,我不确定这些标记传递给内核的位置,但我希望这可以帮助你追踪它。