2010-12-08 14 views
2

Ich habe eine große Menge an C++ - Code, den ich mit SWIG eingepackt habe, und rufe ihn von Java an. Der C++ - Code verwendet liberale Boost-Smart-Pointer.Tipps zum Debuggen von SWIG-umhülltem C++ - Code in Eclipse?

Einige meiner JUnit-Tests sind abgeschlossen, haben aber während der Bereinigung Segmentfehler. Der Stapel-Trace zeigt einen Speicherfehler bei der Finalisierung eines Objekts an, aber er findet im JNI-Code statt, der von SWIG generiert wird, und er scheint mit der Zählung der Smart-Pointer-Referenzen verknüpft zu sein.

Ich möchte in der Lage sein, alle Ebenen des Codes durchlaufen. Ist das möglich? Ich wäre auch sehr glücklich, die Erfahrungen anderer mit solchen Problemen zu hören.

+0

Ich nehme an, Sie sollten zumindest in der Lage sein, Ihren Java-Prozess von dem C++ - Debugger zu starten, den Sie normalerweise verwenden, und einen Unterbrechungspunkt in den JNI-Code einfügen. Obwohl das nicht alle Ebenen des Codes durchläuft ... –

Antwort

1

Sie können einen zweiten Debugger mit systemeigenem Code an den ausführenden Java-Code anhängen. Zum Beispiel können Sie mit Visual Studio über "Debug> An Prozess anhängen" anhängen.

SWIG unterstützt intelligente Zeiger, aber Sie müssen ihre Lebensdauer explizit auf der Java-Seite verwalten. Wenn Sie das Eigentum an einem Smart-Pointer-Objekt auf der Java-Seite erhalten, müssen Sie es löschen. Denken Sie daran, dass Java keine Objekt-Provisorien hat, die den Gültigkeitsbereich überschreiten, sodass Sie keine Ausdrücke wie f(). G(). H() verwenden können, in denen die Rückgabewerte auf jeder Ebene intelligente Zeiger sind.

Ausfallsicher versucht der SWIG-generierte Finalizer, sie für Sie zu löschen, wenn Garbage Collection stattfindet. Diese Failsafe-Funktion ist schädlich, wenn das Objekt bereits auf der C++ - Seite gelöscht wurde.

Verwandte Themen