簡體   English   中英

從java java-> jni.dll - > app.dll - > app.dll調試dll

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM