最近在碰到一段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才會繼續往下走,所以修改後的運行命令類似下面的語句
2. 在java中需要調用JNI代碼的地方設置斷點,然後使用eclipse遠程調試連接java程序運行的機器和端口;
3. 等到eclipse連接後,在命令行看一下上面啟動的java程序的進程PID;
4. 使用gdb連接上面的進程,命令如下