5 Stimmen

Debuggen Sie eine DLL von Java java->jni.dll ->app.dll -> app.dll

Wie kann ich eine DLL debuggen, die nicht von der Java-Anwendung geladen wird.

Das Szenario ist folgendes: Meine Java-App lädt die jni.dll, die eine andere DLL verwendet, und diese DLL verwendet wiederum eine andere DLL.

java<->jni.dll<->dll<->dll

Ich habe den Quellcode für alle Module

Ich verwende Visual Studio Express zum Debuggen der jni.dll, aber was sollte ich tun, um die anderen DLLs debuggen zu können?

8voto

Markus Lausberg Punkte 12030

Aber das ist dasselbe.

Ich mache dasselbe, daher lasse mich mein Arbeitsset erklären.

Ich benutze Eclipse 3.1 und Visual C++ 2003 7.1.3088 (Deutsch... sorry ;) ) und Windows XP. Ich lade some_jni.dll und some.dll in Java und benutze die JNI-Klassen. some.dll lädt intern other.dll. Ich kann some.dll und other.dll im Visual Studio debuggen.

Starten Sie Ihre Anwendung und setzen Sie einen Haltepunkt beim ersten JNI-Klassenaufruf. Öffnen Sie VS und gehen Sie zu "Debuggen" -> "Prozesse". Dort werden Sie javaw.exe sehen.

Wählen Sie javaw.exe aus und klicken Sie auf "Anfügen".

Wenn ich mich erinnere, muss die Code-Seite in C++, an der der Haltepunkt platziert ist, im VS geöffnet sein. VS öffnet die Seite nicht automatisch, wenn der Haltepunkt erreicht ist. Wenn die DLL geladen ist und die Codezeile, an der Sie einen Haltepunkt gesetzt haben, ausgeführt wird, wird der Debugger im VS an dieser Position stehen bleiben. Hinweis: Dies geschieht nur, wenn Sie die DLL, die Sie debuggen möchten, mit Debug-Optionen kompilieren! Andernfalls wird der Debugger nicht an dem C++-Haltepunkt anhalten.

Ich habe dies vor einem halben Jahr gemacht, aber das sollten die richtigen Schritte sein.

Ich hoffe, Sie haben es verstanden.

1voto

Markus Lausberg Punkte 12030

In Visual Studio kannst du den Debugger an einen laufenden Java-Prozess anpassen. Wenn ein Breakpoint im C++-Code erreicht wird, zeigt der Debugger dies in Visual Studio an und stoppt den Prozess.

Im Moment habe ich kein Visual Studio installiert, aber in den Debug-Optionen gibt es ein Fenster, in dem du alle laufenden Prozesse sehen kannst. Suche nach dem Java-Prozess und füge den Prozess zur Debug-Sitzung hinzu.

Wenn die DLL die Zeile ausführt, an der der Breakpoint platziert ist, wirst du es sehen.

EDIT: Die DLL muss mit Debug-Informationen kompiliert werden und nicht im Release-Modus, sonst wird der Debugger in Visual Studio nicht an der Breakpoint anhalten!

0voto

Martin Cowie Punkte 3140

Es ist schon eine Weile her, seit ich das das letzte Mal gemacht habe, und selbst da war es auf Linux & Solaris. Eine unvollständige Lösung besteht darin, 'fest codierte Unterbrechungspunkte' in Ihre DLL mit "_asm int 3;" einzubetten

Wenn Windows diese Anweisung ausführt, erhält der Desktop-Benutzer die Möglichkeit, einen passend konfigurierten Debugger an den betroffenen Prozess anzuhängen.

Es ist nicht ganz so einfach wie das Ausrichten eines Debuggers auf eine bekannte Prozess-ID, aber es sollte Ihnen weiterhelfen.

M.

0voto

sean Punkte 10332

Als Alternative versuchen Sie es mit IKVM. http://www.ikvm.net/

0voto

cx0der Punkte 432

Ein grober Weg, dies zu tun, besteht darin, eine Endlosschleife in der DLL zu erstellen, die Sie debuggen möchten, wie folgt:

int x = 1; while(x);

Sobald die Java-Anwendung diese Schleife durchläuft, hängen Sie sich an diesen Prozess mit einem Debugger und setzen den Wert von x auf 0, um die Schleife zu unterbrechen, und jetzt können Sie Schritt für Schritt mit dem Debugger durchgehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X