Ported the Firefox Profiler to FreeBSD in order to investigate why
WebRender has some jank when scrolling some walls of text on my 4K/HiDPI setup.
The profiler code initially looked somewhat scary:
some Google Breakpad code is used,
a custom stack unwinder called LUL is used on Linux (which also partially derived from Breakpad code)…
Initially, I got it working with “pre-symbolication” (an option to build the goblin ELF parser
into Firefox for this purpose) only, ifdef’ing any Breakpad code out.
the only part of Breakpad used is extracting build IDs from shared objects
(and in fact the “base profiler”, a copy (for now) of the Gecko profiler used for profiling during the early startup phase,
just copied all the relevant code);
devel/breakpad was there in FreeBSD Ports (but expires in like three days!),
and its patches showed that it’s really trivial to get all it working.
So I got the main symbolication system working. Which, it turns out, runs
WebAssembly-compiled goblin in a web worker!
Fun stuff. Requires stripping
libxul for now tho.
In the end, the patch turned out to be mostly just
The only meaningful parts are:
thr_kill2 instead of
supporting the different
mcontext structs, and
(for the pre-symbolication code path) ignoring symbol names returned by
dladdr because they’re hilariously bad.
BTW, earlier in the dev-tools-on-FreeBSD space: heaptrack!
I even used it to find a real memory leak in Wayfire.