Building a debug JVM26 Aug 2015
If you’re interested in learning more about the Hotspot’s internals, theres no way around it - you have to read the code. If you really want to learn, you’ll want to build and run a debug build. This isn’t too bad to do, but a dearth of online documentation makes this much rougher than it should be. I recently reimaged my VPS and recorded every step along the way, which I have relayed here.
Grabbing the source
To grab the code, you’ll need mercurial if you don’t have it aready.
sudo apt-get install mercurial
Java, like any complex project, has a dizzying number of branches. I recommend the
jdk8u branch, aka Java 8 with updates.
hg clone http://hg.openjdk.java.net/jdk8u/jdk8u
Java uses nested repositories to manage different parts of its codebase. Thankfully there is already a script to download all of those for us
cd jdk8u bash ./get_source.sh
OS X users exit stage left
Unfortunately, actually building on newer versions of OS X is a bit of a mess. This blog post has what apparently is a working solution, but I have yet to try it. I keep a copy of the source on my Macbook for easy grepping but do all the actual work elsewhere.
Building the beast
Before you try to configure & make, might as well get all of the dependencies out of the way. This is every package I had to install on a fresh Ubuntu 14 build.
If you skip this the
./configure script gives helpful hints on what install commands to run, but this is even easier. Yes, you need Java (7+) to compile Java
sudo apt-get install zip build-essential make openjdk-7-jdk libcups2-dev libX11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libfreetype6-dev libasound2-dev
(Replace apt with your distro’s package manager of choice. I built this on my work server fine using
yum, although the package names may not have been identical)
Next up is the massive
./configure script. The
--enable-debug tells it to configure the makefiles for a debug build
bash ./configure --enable-debug
On my server it kept complaining about freetype being missing, even after being installed. I got around this by finding the file locations via
dpkg -L libfreetype6-dev
and then manually specifying the lib and header locations to
bash ./configure --enable-debug --with-freetype-include=/usr/include/freetype2/ --with-freetype-lib=/usr/lib/x86_64-linux-gnu/
With everything set up, all you need to do is run
make all. Good time go to grab a cup of coffee/water, or maybe sword fight on chairs.
When its done, why not quickly try our new binary?
jackson@serv:/home/jackson/dev/jdk8u$ build/linux-x86_64-normal-server-fastdebug/jdk/bin/java -version openjdk version "1.8.0-internal-fastdebug" OpenJDK Runtime Environment (build 1.8.0-internal-fastdebug-jackson_2015_08_27_04_18-b00) OpenJDK 64-Bit Server VM (build 25.66-b00-fastdebug, mixed mode)
That wasn’t too bad was it?