Lately I've been reading about the design and implementation of the FreeBSD
Operating System (great book, you should read it).
However I find browsing the source code quite painful. Using vim or emacs is
fine for editing invidual files, but when you are trying to understand and
browse around a large codebase, dropping to a shell and grepping/finding around
gets old fast. I know about ctags and similar, but I also find editors
uncomfortable for browsing large codebases for an extended amount of time -
web pages tend to be easier on the eyes.
There's an LXR fork called FXR available, which is way better and I am
very grateful for it - however it has all the same shortcomings LXR that we've
become very familiar with on the Mozilla LXR fork (MXR):
- based on regex, not static analysis of the code - sometimes it gets things
wrong, and it doesn't really understand the difference between a variable
with the same name in different files
- not particularly easy on the eyes (shallow and easily fixable, I know)
I've been an admirer of Mozilla's next gen code browsing tool, DXR, for a
long time now. DXR uses a clang plugin to do static analysis of the code,
so it produces the real call graph - this means it doesn't need to guess at the
definition of types or where a variable is used, it knows.
A good example is to contrast a file on MXR with the same file on DXR.
Let's say you wanted to know where this macro was first defined, that's
easy in DXR - just click on the word "NS_WARNING" and select "Jump to definition".
Now try that on MXR - clicking on "NS_WARNING" instead yields a search which
is not particularly helpful, since it shows every place in the codebase that
the word "NS_WARNING" appears (note that DXR has the ability to do this same
type of search, in case that's really what you're after).
So that's what DXR is and why it's useful. I got frustrated enough with the
status quo trying to grok the FreeBSD sources that I took a few days and the
with help of folks in the #static channel on irc.mozilla.org (particularly
Erik Rose) to get DXR running on FreeBSD and indexed a tiny part of the source
tree as a proof-of-concept (the source for "/bin/cat"):
http://freebsdxr.rhelmer.org
This is running on a FreeBSD instance in AWS.
DXR is currently undergoing major changes, SQLite to ElasticSearch
transition being the central one. I am tracking how to get the "es" branch of
DXR going in this gist.
Currently I am able to get a LINT kernel build indexed on DXR master branch, but
still working through issues on the "es" branch.
Overall, I feel like I've learned way more about static analysis, how DXR works,
FreeBSD source code and produced some useful patches for the Mozilla and the
DXR project and hopefully will provide a useful resource for the FreeBSD
project, all along the way. Totally worth it, I highly recommended working
with all of the aforementioned :)