[英]debug a dll from java java->jni.dll ->app.dll -> app.dll
如何調試java應用程序未加載的DLL。
場景是這樣的:我的java應用程序正在加載正在使用另一個dll的jni.dll,而dll正在使用另一個dll。
的java < - > jni.dll < - > DLL < - > DLL
我有所有模塊的源代碼
我在調試jni.dll時使用visual studio express但是我該怎么做才能調試其他dll?
但這是一樣的。
我這樣做,所以讓我解釋一下我的工作集。
我正在使用eclipse 3.1和Visual C ++ 2003 7.1.3088(德語......抱歉;))和Windows XP。 我在java中加載some_jni.dll和some.dll並使用jni類。 some.dll加載internaly other.dll。 我可以在visual studio中調試some.dll和other.dll。
啟動應用程序並在第一個jni類調用中添加斷點。 打開VS並轉到(德語)“Debuggen”(調試) - >“Prozesse”(進程)他們你會看到javaw.exe
選擇javaw.exe,然后按“Anfügen”(附加)。
當我記得時,c ++中的代碼頁必須在VS中打開斷點。 當斷點被自動命中時,VS將不會打開頁面。 加載dll並執行放置斷點的代碼行時,VS中的調試器將停在此位置。 注意:只有在使用調試選項編譯要調試的DLL時才會發生這種情況! 否則調試器不會停在C ++斷點處。
我半年前做過這個,但這應該是正確的步驟。
希望你明白。
在visual studio中,您可以將調試器調整為正在運行的java進程。 當命中C ++代碼中的斷點時,調試器將在visual studio中顯示該斷點,並將停止該過程。
目前我沒有安裝Visual Studio,但在調試選項中是一個窗口,您可以在其中查看所有正在運行的進程。 查找java進程並將該進程添加到調試會話中。
當dll執行放置斷點的行時,您將看到它。
編輯:您必須使用調試信息編譯而不是在發布模式下編譯,否則視覺工作室中的debuger將不會在斷點處停止!
一種粗略的做法是在要調試的dll中創建一個無限循環:
int x = 1;
while(x);
一旦Java應用程序進入此循環,就通過調試器附加到此進程,並將x
的值設置為0
以打破循環,現在您可以逐步使用調試器。
自從我上次這樣做以來已經有很長一段時間了,即便如此,它還是在Linux和Solaris上。 一個不完整的解決方案是在你的DLL中使用“ _asm int 3;
”嵌入“硬編碼斷點”
每當Windows執行此指令時,它都會讓桌面用戶有機會將適當配置的調試器附加到受影響的進程。
它不像將調試器指向已知進程ID那樣順利,但它應該讓你前進。
M.
作為替代方案,請嘗試IKVM。 http://www.ikvm.net/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.