Question

As some of you might know Google provides for free great collection of tools for analyzing c++ code: http://code.google.com/p/google-perftools/

Problem is that there is apparently some libunwind problem on 64 bits, and authors can't do anything on their side to fix it(

But I don't expect a fix anytime soon: it depends on the libc folks and the libunwind folks working out some locking issues. There's unfortunately not much we ourselves can do.

), so I'm searching for replacement. Is there any similar tool that provides cool graphical representation of profiling data(for example: enter image description here)

)

EDIT: paste from README that explains the problem:

2) On x86-64 64-bit systems, while tcmalloc itself works fine, the cpu-profiler tool is unreliable: it will sometimes work, but sometimes cause a segfault. I'll explain the problem first, and then some workarounds.

Note that this only affects the cpu-profiler, which is a google-perftools feature you must turn on manually by setting the CPUPROFILE environment variable. If you do not turn on cpu-profiling, you shouldn't see any crashes due to perftools.

The gory details: The underlying problem is in the backtrace() function, which is a built-in function in libc. Backtracing is fairly straightforward in the normal case, but can run into problems when having to backtrace across a signal frame. Unfortunately, the cpu-profiler uses signals in order to register a profiling event, so every backtrace that the profiler does crosses a signal frame.

In our experience, the only time there is trouble is when the signal fires in the middle of pthread_mutex_lock. pthread_mutex_lock is called quite a bit from system libraries, particularly at program startup and when creating a new thread.

The solution: The dwarf debugging format has support for 'cfi annotations', which make it easy to recognize a signal frame. Some OS distributions, such as Fedora and gentoo 2007.0, already have added cfi annotations to their libc. A future version of libunwind should recognize these annotations; these systems should not see any crashses.

Workarounds: If you see problems with crashes when running the cpu-profiler, consider inserting ProfilerStart()/ProfilerStop() into your code, rather than setting CPUPROFILE. This will profile only those sections of the codebase. Though we haven't done much testing, in theory this should reduce the chance of crashes by limiting the signal generation to only a small part of the codebase. Ideally, you would not use ProfilerStart()/ProfilerStop() around code that spawns new threads, or is otherwise likely to cause a call to pthread_mutex_lock!

--- 17 May 2011

Was it helpful?

Solution

Valgrind has a collection of great tools, including callgrind to profile the code. The gui client for the callgrind and cachegrind is kcachegrind.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top