aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/trace_profile/callgrind.md
diff options
context:
space:
mode:
Diffstat (limited to 'src/trace_profile/callgrind.md')
-rw-r--r--src/trace_profile/callgrind.md76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/trace_profile/callgrind.md b/src/trace_profile/callgrind.md
new file mode 100644
index 0000000..1336a9e
--- /dev/null
+++ b/src/trace_profile/callgrind.md
@@ -0,0 +1,76 @@
+# callgrind
+
+Callgrind is a tracing profiler to record the function call history of a target
+program. It is part of the [valgrind][callgrind] tool suite.
+
+Profiling data is collected by instrumentation rather than sampling of the
+target program.
+
+Callgrind does not capture the actual time spent in a function but computes the
+cost of a function based on the instructions fetched (`Ir = Instruction read`).
+Therefore effects like slow IO are not reflected, which should be kept in mind
+when analyzing callgrind results.
+
+By default the profiler data is dumped when the target process is terminating,
+but [callgrind_control] allows for interactive control of callgrind.
+```bash
+# Run a program under callgrind.
+valgrind --tool=callgrind -- <prog>
+
+# Interactive control of callgrind.
+callgrind_control [opts]
+ opts:
+ -b ............. show current backtrace
+ -e ............. show current event counters
+ -s ............. show current stats
+ --dump[=file] .. dump current collection
+ -i=on|off ...... turn instrumentation on|off
+```
+
+Results can be analyzed by using one of the following tools
+- [callgrind_annotate] (cli)
+- [kcachegrind] (ui)
+
+The following is a collection of frequently used callgrind options.
+```bash
+valgrind --tool=callgrind [opts] -- <prog>
+ opts:
+ --callgrind-out-file=<file> .... output file, rather than callgrind.out.<pid>
+ --dump-instr=<yes|no> .......... annotation on instrucion level,
+ allows for asm annotations
+
+ --instr-atstart=<yes|no> ....... control if instrumentation is enabled from
+ beginning of the program
+
+ --separate-threads=<yes|no> .... create separate output files per thread,
+ appends -<thread_id> to the output file
+```
+
+## Profile specific part of the target
+Programmatically enable/disable instrumentation using the macros defined in
+the callgrind header.
+```c
+#include <valgrind/callgrind.h>
+
+int main() {
+ // init ..
+
+ CALLGRIND_START_INSTRUMENTATION;
+ compute();
+ CALLGRIND_STOP_INSTRUMENTATION;
+
+ // shutdown ..
+}
+```
+> In this case, callgrind should be launched with `--instr-atstart=no`.
+
+Alternatively instrumentation can be controlled with `callgrind_control -i
+on/off`.
+
+The files [cg_example.cc](callgrind/cg_example.cc) and
+[Makefile](callgrind/Makefile) provide a full example.
+
+[callgrind]: https://valgrind.org/docs/manual/cl-manual.html
+[callgrind_annotate]: https://valgrind.org/docs/manual/cl-manual.html#cl-manual.callgrind_annotate-options
+[callgrind_control]: https://valgrind.org/docs/manual/cl-manual.html#cl-manual.callgrind_control-options
+[kcachegrind]: https://kcachegrind.github.io/html/Home.html