Converting Valgrind callgrinds to SVG format
post, Feb 28, 2024, on Mitja Felicijan's blog
Lately I have been doing a lot of systems programming and profiling is
the name of the game when it comes to developing good software.
I found Valgrind indispensable for profiling
and getting callgraphs.
Most of the time there are better alternatives that SVG to drill intro the
callgraphs but if you need to put put a callgraph on a webpage or maybe
send it to somebody that does not have all of the necessary software to
view these things then SVG is the perfect format for this.
Theses are couple of amazing applications to view callgraphs that get
exported by Valgrind:
This is how Kcachekrind looks with a callgraph loaded in. Not only that,
with Kcachegrind you can also explore assembly produced by the compiler
and get much more insight into the profile of your application.
After this point you will need couple of things installed on your
system. I will show how you do this on Fedora 39.
# Install valgrind which will do the actual profiling.
sudo dnf install valgrind
# Install Kcachegrind for local visualizing.
sudo dnf install kcachegrind
# Install gprof2dot for conversion from .dot to .svg.
pip install gprof2dot
Let's make a simple C program and test out profiling and the whole shebang.
#include <stdio.h>
int main() {
printf("Oh, hi Mark\n");
return 0;
}
Then let's compile, convert to dot and then SVG file.
clang hi.c -o c-hi
valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes ./c-hi
gprof2dot --format=callgrind --output=out.c.dot --colormap=print callgrind.out.546168
cat out.c.dot | dot -Tsvg > out.c.svg
This gives us an SVG file like this.
And this also works on other binaries.
Lets give Zig a go.
const std = @import("std");
pub fn main() !void {
std.debug.print("Oh, hi Mark!\n", .{});
}
Now repeat the whole compile, convert cycle.
zig build-exe hi.zig --name zig-hi
valgrind --tool=callgrind --dump-instr=yes --collect-jumps=yes ./zig-hi
gprof2dot --format=callgrind --output=out.zig.dot --colormap=print callgrind.out.546168
cat out.zig.dot | dot -Tsvg > out.zig.svg

Now, to be fair
Kcachegrind is much nicer
for local exploration and digging deep into the callgraphs, but the SVG
format can still provide valid information for documentation and things
of that nature.