我正在一个基于Freescale MX51的Linux 2.6.35板上开发GUI重的C++应用程序,我想进行堆分析。
不幸的是,我找到的所有堆分析工具都要么过于侵入性,要么在ARM上似乎无法工作。我尝试过的具体工具:
- Valgrind Massif: 在我的平台上无法使用,因为该平台的CPU太弱。由Massif引入的80% CPU时间开销会导致我应用程序中出现无法补偿的一系列问题。
- gperftools(前身为Google性能工具)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上遇到类似问题:Missing frames on shared libraries on ARM