天天看點

使用GDB調試JNI代碼

最近在碰到一段JNI代碼不停的出現core dump,用gdb看了一下core檔案,資訊也不是很清楚,于是想到了運作是debug JNI代碼

,對于JNI代碼要想動态debug還是有點小工作要做的,如下:

1. 首先修改java參數,添加-Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n作為java參數,其中8888是端口号,suspend=n意思是java啟動的時候不等待用戶端debug連接配接,如果自己的程式是在一啟動就需要調用JNI,這裡可以将其值設定為suspend=n,這樣java程序就會啟動,然後等待用戶端比如eclipse去遠端調試,等于eclipse的遠端調試連接配接後,java才會繼續往下走,是以修改後的運作指令類似下面的語句

$ java -Xms64m -Xmx512m -Xdebug -Xrunjdwp:transport=dt_socket,address=8888,server=y,suspend=n MyClass

2. 在java中需要調用JNI代碼的地方設定斷點,然後使用eclipse遠端調試連接配接java程式運作的機器和端口;

3. 等到eclipse連接配接後,在指令行看一下上面啟動的java程式的程序PID;

4. 使用gdb連接配接上面的程序,指令如下

$ gdb -p <pid>5. 設定斷點在需要調試的JNI方法位置,如下:

(gdb) break <method_name>6. 然後就可以使用各種gdb指令來調試和列印各個變量了。