正如你们中的一些人可能知道谷歌提供免费的大量工具来分析c ++代码: http://code.google.com/p/google-perftools/
问题是64位上显然存在一些libunwind问题,作者无法做任何事情来修复它(
但我不指望 很快就会修复:它取决于libc人员和libunwind 人们解决了一些锁定问题。遗憾的是没有 我们自己能做的很多。
),所以我正在寻找替代品。 是否有任何类似的工具提供分析数据的酷图形表示(例如:)
)
编辑:从README粘贴解释问题:
2)在x86-64 64位系统上,虽然tcmalloc本身工作正常,但是 cpu-profiler工具不可靠:它有时会起作用,但有时候会起作用 导致段错误。我先解释一下这个问题,然后再解释一下 的解决方法。
请注意,这只会影响cpu-profiler,它是一个 google-perftools功能必须通过设置来手动打开 CPUPROFILE环境变量。如果你没有打开cpu-profiling, 你不应该看到由于穿孔工具造成的任何崩溃。
血腥细节:潜在的问题在于回溯() function,这是libc中的内置函数。回溯是公平的 在正常情况下直截了当,但在遇到问题时可能会遇到问题 必须回溯信号帧。不幸的是, cpu-profiler使用信号来注册分析事件,所以 探查器确实穿过信号帧的每个回溯。
根据我们的经验,唯一出现问题的时候是信号 在pthread_mutex_lock中间触发。 pthread_mutex_lock是 从系统库中调用了很多,特别是在程序中 启动时和创建新线程时。
解决方案:矮人调试格式支持'cfi 注释',这使得识别信号帧变得容易。一些OS Fedora和gentoo 2007.0等发行版已经添加了 cfi对他们的libc的注释。 libunwind的未来版本应该 认识到这些注释;这些系统不应该看到任何 crashses。
解决方法:如果您在运行时遇到崩溃问题 cpu-profiler,考虑插入ProfilerStart()/ ProfilerStop() 你的代码,而不是设置CPUPROFILE。这只会配置文件 代码库的那些部分。虽然我们没有做太多测试, 理论上,这应该通过限制崩溃来减少崩溃的机会 信号只生成代码库的一小部分。理想情况下,你 不会在生成的代码周围使用ProfilerStart()/ ProfilerStop() 新线程,否则可能会导致调用 调用pthread_mutex_consistent_np!
--- 2011年5月17日