Debugging Java Native Interface (JNI) DLLs using Microsoft Visual C++ 2008 Express and NetBeans 6.9
Sometimes your JNI DLLs will crash, leaving you with the fun task of
figuring out why. If you have access to the native source code, this
proves to be pretty easy.
First, you need to create the Java application and JNI DLL in the usual
manner. The process of creating the source code for the JNI is not
covered here, but the project files for the examples used to create the
screenshots can be obtained by downloading the following zip file.
test-jni-example-files.zip
In your NetBeans project directory, you will notice that the dist
directory containing the Java application also contains the JNI DLL and
Program Debug Database (pdb) file, which is needed to map errors to the
corresponding source code. You have to copy these two files by hand to
the dist directory after building them in VS2008 Express. In a real
environment, these would hopefully be built by continuous integration.
In NetBeans, run the Java application. The following should appear:
In VS2008 Express, with the DLL project open, go to the Debug -> Attach
to Process menu option and attach to the running copy of the Java
application.
By default in VS2008 Express, only a select number of exceptions are caught by
default by the debugger. However, you want to make sure all exceptions are caught,
so make sure that the checkmark next to "Win32 Exceptions" is fully black-and-white
and not gray.
In the Java application, click on the Test Bad Function button.
When the badFunction is called, and it attempts to write to an invalid memory
location, the Visual Studio debugger will catch this exception and show you the
line of code responsible.
This should provide you the information needed to implement a fix.