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
- Elitist attitudes are sapping all the fun from programming
- Using GoAccess with Nginx to replace Google Analytics
- My love and hate relationship with Node.js
- Re-Inventing Task Runner That I Actually Used Daily
- The strange case of Elasticsearch allocation failure
- Getting started with MicroPython and ESP8266
- Using DigitalOcean Spaces Object Storage with FUSE
- Using custom software with Github Actions to deploy a site
- Profiling Python web applications with visual tools
- Rekindling my love for programming and enjoying the act of creating
- Using sentiment analysis for clickbait detection in RSS feeds
- Who knows what the world will look like tomorrow
- List of essential Linux commands for server management
- State of Web Technologies and Web development in year 2022