Code Coverage for OpenJDK Windows Binaries

Build the OpenJDK source code using these commands:

bash configure --with-debug-level=slowdebug --with-jtreg=/cygdrive/c/java/binaries/jtreg/jtreg-7.5.1+1 --with-gtest=/cygdrive/c/repos/googletest --with-extra-ldflags=-profile --with-boot-jdk=/cygdrive/c/java/binaries/jdk/x64/jdk-24+36

time /cygdrive/c/repos/scratchpad/scripts/java/cygwin/build-jdk.sh windows x86_64 slowdebug

The --with-extra-ldflags=-profile argument enables the /PROFILE (Performance Tools Profiler) | Microsoft Learn linker option when building native binaries. build-jdk.sh is a custom script in my scratchpad repo.

Instrumenting the DLLs and EXEs

The Microsoft.CodeCoverage.Console tool can be used to collect code coverage for C++ code. To use it, open the “Developer Command Prompt” – it should be in the path by default. Once the OpenJDK build completes, instrument the DLLs and EXEs as follows:

Microsoft.CodeCoverage.Console.exe instrument attach.dll
Microsoft.CodeCoverage.Console.exe instrument awt.dll
Microsoft.CodeCoverage.Console.exe instrument dt_shmem.dll
Microsoft.CodeCoverage.Console.exe instrument dt_socket.dll
Microsoft.CodeCoverage.Console.exe instrument extnet.dll
Microsoft.CodeCoverage.Console.exe instrument fontmanager.dll
Microsoft.CodeCoverage.Console.exe instrument freetype.dll
Microsoft.CodeCoverage.Console.exe instrument instrument.dll
Microsoft.CodeCoverage.Console.exe instrument j2gss.dll
Microsoft.CodeCoverage.Console.exe instrument j2pcsc.dll
Microsoft.CodeCoverage.Console.exe instrument j2pkcs11.dll
Microsoft.CodeCoverage.Console.exe instrument jaas.dll
Microsoft.CodeCoverage.Console.exe instrument java.dll
Microsoft.CodeCoverage.Console.exe instrument javajpeg.dll
Microsoft.CodeCoverage.Console.exe instrument jawt.dll
Microsoft.CodeCoverage.Console.exe instrument jimage.dll
Microsoft.CodeCoverage.Console.exe instrument jli.dll
Microsoft.CodeCoverage.Console.exe instrument jpackage.dll
Microsoft.CodeCoverage.Console.exe instrument jsound.dll
Microsoft.CodeCoverage.Console.exe instrument jsvml.dll
Microsoft.CodeCoverage.Console.exe instrument lcms.dll
Microsoft.CodeCoverage.Console.exe instrument management.dll
Microsoft.CodeCoverage.Console.exe instrument management_agent.dll
Microsoft.CodeCoverage.Console.exe instrument management_ext.dll
Microsoft.CodeCoverage.Console.exe instrument mlib_image.dll
Microsoft.CodeCoverage.Console.exe instrument net.dll
Microsoft.CodeCoverage.Console.exe instrument nio.dll
Microsoft.CodeCoverage.Console.exe instrument prefs.dll
Microsoft.CodeCoverage.Console.exe instrument rmi.dll
Microsoft.CodeCoverage.Console.exe instrument saproc.dll
Microsoft.CodeCoverage.Console.exe instrument splashscreen.dll
Microsoft.CodeCoverage.Console.exe instrument sspi_bridge.dll
Microsoft.CodeCoverage.Console.exe instrument sunmscapi.dll
Microsoft.CodeCoverage.Console.exe instrument syslookup.dll
Microsoft.CodeCoverage.Console.exe instrument verify.dll
Microsoft.CodeCoverage.Console.exe instrument w2k_lsa_auth.dll
Microsoft.CodeCoverage.Console.exe instrument zip.dll

Microsoft.CodeCoverage.Console.exe instrument jabswitch.exe
Microsoft.CodeCoverage.Console.exe instrument jaccessinspector.exe
Microsoft.CodeCoverage.Console.exe instrument jaccesswalker.exe
Microsoft.CodeCoverage.Console.exe instrument jar.exe
Microsoft.CodeCoverage.Console.exe instrument jarsigner.exe
Microsoft.CodeCoverage.Console.exe instrument java.exe
Microsoft.CodeCoverage.Console.exe instrument javac.exe
Microsoft.CodeCoverage.Console.exe instrument javadoc.exe
Microsoft.CodeCoverage.Console.exe instrument javap.exe
Microsoft.CodeCoverage.Console.exe instrument javaw.exe
Microsoft.CodeCoverage.Console.exe instrument jcmd.exe
Microsoft.CodeCoverage.Console.exe instrument jconsole.exe
Microsoft.CodeCoverage.Console.exe instrument jdb.exe
Microsoft.CodeCoverage.Console.exe instrument jdeprscan.exe
Microsoft.CodeCoverage.Console.exe instrument jdeps.exe
Microsoft.CodeCoverage.Console.exe instrument jfr.exe
Microsoft.CodeCoverage.Console.exe instrument jhsdb.exe
Microsoft.CodeCoverage.Console.exe instrument jimage.exe
Microsoft.CodeCoverage.Console.exe instrument jinfo.exe
Microsoft.CodeCoverage.Console.exe instrument jlink.exe
Microsoft.CodeCoverage.Console.exe instrument jmap.exe
Microsoft.CodeCoverage.Console.exe instrument jmod.exe
Microsoft.CodeCoverage.Console.exe instrument jnativescan.exe
Microsoft.CodeCoverage.Console.exe instrument jpackage.exe
Microsoft.CodeCoverage.Console.exe instrument jps.exe
Microsoft.CodeCoverage.Console.exe instrument jrunscript.exe
Microsoft.CodeCoverage.Console.exe instrument jshell.exe
Microsoft.CodeCoverage.Console.exe instrument jstack.exe
Microsoft.CodeCoverage.Console.exe instrument jstat.exe
Microsoft.CodeCoverage.Console.exe instrument jstatd.exe
Microsoft.CodeCoverage.Console.exe instrument jwebserver.exe
Microsoft.CodeCoverage.Console.exe instrument keytool.exe
Microsoft.CodeCoverage.Console.exe instrument kinit.exe
Microsoft.CodeCoverage.Console.exe instrument klist.exe
Microsoft.CodeCoverage.Console.exe instrument ktab.exe
Microsoft.CodeCoverage.Console.exe instrument rmiregistry.exe
Microsoft.CodeCoverage.Console.exe instrument serialver.exe

The files in the subdirectory named after the HotSpot variant also need to be instrumented:

cd server
Microsoft.CodeCoverage.Console.exe instrument jvm.dll

Collecting Code Coverage

Use the collect command to execute the binary and create a code coverage file (named output.coverage by default):

Microsoft.CodeCoverage.Console.exe collect ".\java -version"

Run start output.coverage to open the code coverage file. You can use the search filter to narrow down the coverage results, e.g. by searching for “interpreter”.

Files Not Instrumented

My list from last year had these 3 files, which are no longer present in the build so keep in mind that you need to ensure your list is current and exhaustive:

javaaccessbridge.dll
jdwp.dll
windowsaccessbridge-64.dll

These files are not instrumented (this message is displayed: Module was not instrumented. Reason: nothing_instrumented.)

jsvml.dll
syslookup.dll

I ignore them for now because they don’t contain the code I’m inspecting.

Listing DLLs and EXEs

I used the ls -1 command to get a list of file names only in Git Bash but they have an asterisk appended to them.

$ ls -1 *.exe
jabswitch.exe*
jaccessinspector.exe*
jaccesswalker.exe*
jar.exe*
jarsigner.exe*
java.exe*
javac.exe*
...

shell – Executables show with character * next to their name in output of ls – Unix & Linux Stack Exchange clarifies that I probably an alias for ls containing the -F option. Sure enough:

$ alias ls
alias ls='ls -F --color=auto --show-control-chars'

$ which ls
/usr/bin/ls

$ /usr/bin/ls -1 *.exe
jabswitch.exe
jaccessinspector.exe
jaccesswalker.exe
...