我正在基于 Freescale MX51 的开发板 Linux 2.6.35 上开发一个 GUI 繁重的 C++ 应用程序。我想执行堆分析。
不幸的是,我发现的所有堆分析工具要么过于侵入,要么表面上无法在 ARM 上运行。我尝试过的具体工具:
- Valgrind Massif:由于平台的 CPU 很弱,在我的平台上无法使用。Massif 引入的 80% CPU 时间开销在我的应用程序中导致了一系列无法弥补的问题。
- gperftools (以前的谷歌性能工具)tcmalloc:除了堆分析器,这个相当非侵入性的、基于库的
libc malloc()
替换的所有功能都适用于我的目标换句话说,线程缓存分配器有效,但探查器无效。我将在下面为任何好奇的人解释分析器的故障模式。
谁能推荐一套替代工具来在 ARM 平台上执行 C++ 堆分析?理想的输出最终将是一个有向分配图,类似于 gperftools 的 tcmalloc 输出。低资源利用率是必须的——我的平台是高度资源受限的。
gperftools 的 tcmalloc 的故障模式解释:
我只为那些好奇的人提供这些信息;我不期待回应。我在下面看到类似于 gperftools 的问题 #407 的内容,除了在 ARM 而不是 x86 上。具体来说,我总是收到“未找到挂钩分配器框架,返回空跟踪”的消息。我花了一些时间调试这个问题,似乎在动态链接 tcmalloc 库时,我的应用程序和动态库之间的边界处的帧指针为空 - 堆栈不能在调用“上方”进入动态库。
gperftools 问题 #407:https ://github.com/gperftools/gperftools/issues/410
stackoverflow 用户在 ARM 上看到类似问题:ARM上的共享库中缺少帧