3.8 KiB
Linux Profiling
Profiling code is enabled when the use_allocator
variable in gyp is set to
tcmalloc
and profiling
variable in gyp is set to 1
. That will build the
tcmalloc library, including the cpu profiling and heap profiling code into
shaka-packager, e.g.
GYP_DEFINES='profiling=1 use_allocator="tcmalloc"' gclient runhooks
If the stack traces in your profiles are incomplete, this may be due to missing
frame pointers in some of the libraries. A workaround is to use the
linux_keep_shadow_stacks=1
gyp option. This will keep a shadow stack using the
-finstrument-functions
option of gcc and consult the stack when unwinding.
CPU Profiling
In order to enable cpu profiling, run shaka-packager with the environment
variable CPUPROFILE
set to a filename. For example:
CPUPROFILE=/tmp/cpuprofile out/Release/packager
The cpu profile will be dumped periodically to the filename specified in the
CPUPROFILE environment variable. You can then analyze the dumps using the pprof
script (packager/third_party/tcmalloc/chromium/src/pprof
). For example,
pprof --gv out/Release/packager /tmp/cpuprofile
This will generate a visual representation of the cpu profile as a postscript
file and load it up using gv
. For more powerful commands, please refer to the
pprof help output and the google-perftools documentation.
For further information, please refer to http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html.
Heap Profiling
To turn on the heap profiler on shaka-packager, use the HEAPPROFILE
environment variable to specify a filename for the heap profile. For example:
HEAPPROFILE=/tmp/heapprofile out/Release/packager
The heap profile will be dumped periodically to the filename specified in the
HEAPPROFILE
environment variable. The dumps can be analyzed using the same
command as cpu profiling above.
For further information, please refer to http://google-perftools.googlecode.com/svn/trunk/doc/heapprofile.html.
Some tests fork short-living processes which have a small memory footprint. To
catch those, use the HEAP_PROFILE_ALLOCATION_INTERVAL
environment variable.
Dumping a profile of a running process
To programmatically generate a heap profile before exit, use code like:
#include <packager/third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h>
// "foobar" will be included in the message printed to the console
HeapProfilerDump("foobar");
Then add allocator.gyp dependency to the target with the above change:
'conditions': [
['profiling==1', {
'dependencies': [
'base/allocator/allocator.gyp:allocator',
],
}],
],
Or you can use gdb to attach at any point:
- Attach gdb to the process:
$ gdb -p 12345
- Cause it to dump a profile:
(gdb) p HeapProfilerDump("foobar")
- The filename will be printed on the console, e.g.
"
Dumping heap profile to heap.0001.heap (foobar)
"
Thread sanitizer (tsan)
To compile with the thread sanitizer library (tsan), you must set clang as your
compiler and set the tsan=1
and tsan_blacklist
configs:
CC=clang CXX=clang++ GYP_DEFINES="tsan=1 tsan_blacklist=/path/to/src/packager/tools/memory/tsan_v2/ignores.txt" gclient runhooks
NOTE: tsan and asan cannot be used at the same time.
Adddress sanitizer (asan)
To compile with the address sanitizer library (asan), you must set clang as your
compiler and set the asan=1
config:
CC=clang CXX=clang++ GYP_DEFINES="asan=1" gclient runhooks
NOTE: tsan and asan cannot be used at the same time.
Leak sanitizer (lsan)
To compile with the leak sanitizer library (lsan), you must set clang as your
compiler and set the lsan=1
config:
CC=clang CXX=clang++ GYP_DEFINES="lsan=1" gclient runhooks