2015-04-06 43 views
1

使用java 8.我有一個junit測試,可以在Windows上正常工作,並在Linux上失敗。相同的代碼,只爲不同的平臺編譯。調用從java到jni到第三個庫(都是內部編寫的)。我想在Linux上的jni和lib級別調試調用,以便我可以看到變量,返回值等可能存在的差異。如何從螞蟻任務調試jni代碼?

在Windows上,這是一個快速:從IntelliJ運行測試,set斷點即將到達jni調用之前,啓動Visual Studio並附加到適當的java進程並在其中設置斷點。讓它運行並觀察,隨時觀察。

如何在Linux上做同樣的事情?具體來說,調試jni和lib?我可以從螞蟻運行測試,但是可以嘗試其他方式在Linux上運行它。

+0

gdb可能很好用 – jgr208

+0

你可以進一步瞭解一下嗎?我嘗試從gdb運行ant,但它說(關於ant):「文件格式無法識別」。繼續,我試圖在我想停止的方法上設置一個斷點,它告訴我我沒有加載符號表,使用文件命令。所以我輸入了「file /path/to/libxxx.so」,然後鍵入'run -f junit.xml',它試圖運行libxx.so文件時進行了segfaulted。 – Jon

+0

呵呵?你不能從gdb運行ant,它聽起來就像你想從螞蟻調用gdb – jgr208

回答

0

您可以使用Eclipse與CDT插件實現相同的功能。該過程基本上是一樣的: 1.啓動Java項目,並在一開始 2.運行CPP的庫代碼中設置斷點停止它,重視剛開始

按照本教程設置它的Java進程。本教程適用於Windows,但您可以密切關注Unix。 http://codeandme.blogspot.com.br/2011/09/jni-made-easy.html

我正在用Mac來做到這一點。在Java進程上附加Lib後,我剛剛遇到了一些問題,我必須稍等一會才能啓動它,然後單擊Cpp進程(在Eclipse Debug視圖中)並恢復cpp進程,然後再返回到Java進程並恢復它。之後,調試正常運行並停止在任何Cpp斷點上。

0

我知道這是一個遲到的答案,但我昨天剛剛完成了這個。所以我想我會分享...

你需要做的第一件事就是用你所有的調試信息構建你的.so庫。我用這些標誌:-g -D DEBUG -O0。這將允許你在gdb中看到你的源代碼。

接下來,將LD_LIBRARY_PATH設置爲共享庫退出的目錄。現在

,您可以通過快速連續的終端中運行三個命令連接GDB到Ant測試:

第一:運行Ant試驗:

$ ant <test> & 

則:得到的PID你測試:

$ ps -ef | grep java 

最後:連接到進程:

$ gdb -p <pid> 

注意事項:

  1. 運行在後臺螞蟻測試(與&),這樣就可以快速運行ps命令。

  2. 如果您的測試測試快速完成(少於30秒),那麼我會考慮在您的第一個JNI調用之前將Thread.sleep(30000);置於Java代碼的開頭。這樣可以在測試退出之前有足夠的時間將gdb附加到進程。