Converting Valgrind callgrinds to SVG format
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:
- Kcachegrind - Linux
- WinCacheGrind - Windows
- Profiling Viewer - macOS
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.
Other posts
- Using DigitalOcean Spaces Object Storage with FUSE
- Disable mouse wake from suspend with systemd service
- The abysmal state of GNU/Linux and a case against shared object libraries
- I think I was completely wrong about Git workflows
- Debian based riced up distribution for Developers and DevOps folks
- Create placeholder images with sharp Node.js image processing library
- Simple Server-Sent Events based PubSub Server
- Simplifying and reducing clutter in my life and work
- Bringing all of my projects together under one umbrella
- Rekindling my love for programming and enjoying the act of creating
- The strange case of Elasticsearch allocation failure
- List of essential Linux commands for server management
- Simple world clock with eInk display and Raspberry Pi Zero
- Replacing Dropbox in favor of DigitalOcean spaces
- Who knows what the world will look like tomorrow