2008-12-16 19 views
51

Otrzymuję wyjątek NullPointerException w klasie z biblioteki innej firmy. Teraz chciałbym debugować całą sprawę i musiałbym wiedzieć, z jakiego obiektu odbywa się ta klasa. Ale wydaje mi się, że nie mogę ustawić punktu przerwania w klasie od strony trzeciej.Jak ustawić punkt przerwania w środowisku Eclipse w bibliotece innej firmy?

Czy ktoś zna wyjście z mojego kłopotu? Oczywiście używam Eclipse jako mojego IDE.

Aktualizacja: biblioteka jest open-source.

Odpowiedz

31

Najbardziej pewnym sposobem na zrobienie tego (a kończy się na czymś, co jest rzeczywiście użyteczne) jest pobranie źródła (mówisz, że jest to open-source) i skonfigurowanie kolejnego "Projektu Java" wskazującego na to źródło.

Aby to zrobić, pobierz źródło pobrane i rozpakowane gdzieś w systemie. Kliknij "Plik" -> "Nowy" -> "Projekt Java". W następnym oknie dialogowym nadaj mu nazwę projektu i wybierz "Utwórz projekt z istniejącego źródła". Przejdź do głównej lokalizacji biblioteki open source.

Załóżmy, że wszystkie dodatkowe biblioteki wymagane przez projekt i takie są zawarte w pobranym projekcie, Eclipse wykombinuje wszystko i ustawi ścieżkę kompilacji dla Ciebie.

Musisz usunąć słoik o otwartym kodzie źródłowym ze ścieżki budowania projektu i dodać ten nowy projekt do ścieżki budowania projektu.

Teraz możesz po prostu traktować to jako swój kod i debugować dowolnie.

To dostaje wokół co najmniej kilka problemów z innymi podejściami:

  1. Można „dołączyć źródło” do pliku jar, ale jeśli plik słoik został skompilowany bez informacji debugowania, to jeszcze wygrał” t działa. Jeśli plik jar został skompilowany z informacjami debugowania (lines,source,vars ... zobacz http://java.sun.com/j2se/1.3/docs/tooldocs/win32/javac.html i opcję -g).

  2. Możesz dodać "punkt zatrzymania wyjątku", aby zobaczyć, kiedy podniesiony zostanie wyjątek NullPointerException, ale jest to typowy wyjątek i może zostać podniesiony i potraktowany wiele (setki?) Razy przed tym, którego szukasz dla. Dodatkowo, bez oryginalnego źródła, nie będziesz w stanie naprawdę wiele zobaczyć na temat kodu, który rzuca wyjątek NullPointerException - prawdopodobieństwo, że będziesz w stanie dowiedzieć się, co jest źle jest dość niskie.

+0

podczas debugowania biblioteki zewnętrznej, jeśli widzimy komentarze w klasach tej biblioteki, czy to znaczy, że została ona skompilowana przy użyciu opcji '-g'? Dokument stwierdza, że ​​'-g: Generuj wszystkie informacje dotyczące debugowania, w tym zmienne lokalne., Następnie wymienione są tylko' source', 'lines' i &" variable ". Czytałem na coderanch, że "prawdziwe nazwy pól" są również używane http://www.coderanch.com/t/262054/java-programmer-SCJP/certification/javac-option. Ale nic nie jest wspomniane o komentarzach. –

+0

Spodziewałbym się, że opcja '-g' pozwoli nam na przeprowadzenie debugowania bez żadnych problemów, tzn. Będzie w stanie zsynchronizować debuger z kodem. Sądzę, że jedynym sposobem, aby to zrobić, jest pozostawienie plików klas "nietkniętych". Czy to właśnie robi?uwaga: Szukałem jasnych informacji na ten temat, ale wydaje się, że generowanie słoika z & a następnie bez '-g' jest jedynym sposobem, aby dowiedzieć się, co faktycznie zmienia się przy użyciu opcji' -g'. –

58

Można łatwo ustawić punkty przerwania metod w bibliotekach innych firm bez źródła. Po prostu otwórz klasę (otrzymasz widok "i-have-no-source"). Otwórz konspekt, kliknij prawym przyciskiem myszy wybraną metodę i kliknij Toggle Method Breakpoint, aby utworzyć punkt zatrzymania metody.

+2

Wymaga to skompilowania biblioteki innej firmy z symbolami debugowania. –

+0

Ah, może nie ... ale znalazłem, że nie mogłem umieścić punktu przerwania metody w interfejsie ServletResponse, podczas gdy ja mogłem umieścić jeden w klasie implementacji (ServletResponseWrapper). –

+1

Niedostępne ... – kolobok

1

Zwykle powinieneś mieć możliwość ustawienia punktu przerwania. Zwłaszcza jeśli biblioteka innych firm jest open source. Ale jeśli twoja licencja pochodząca od innych firm pochodzi od komercyjnego dostawcy, być może skompilowała źródło z wyłączoną flagą debugowania. To uniemożliwi ci debugowanie. Twój sprzedawca mógł to zrobić w ramach procesu zaciemniania, uniemożliwiającego inżynierię wsteczną biblioteki lub po prostu dlatego, że ostateczne skompilowane klasy będą mniejsze.

+0

Zapytam kolegę, czy flaga debugowania była wyłączona. – boutta

6

Można również ustawić punkty przerwania dla określonych wyjątków. Z perspektywy debugowania dostępny jest przycisk "Dodaj punkt przerwania wyjątków Java", a tam można dodać "wyjątek NullPointerException". Twój debugger zawiesza wykonanie, gdy tylko zostanie zgłoszony wyjątek.

+0

To nie przechwytuje wyjątków wyrzuconych w bibliotece. Być może jest coś w tym, co powiedział Bent, gdy nie ustawiono flag debugowania. – boutta

+0

Nigdy nie widziałem, aby tak się stało. JVM nadal ma ślad stosu, po prostu nie ma numerów źródłowych ani wierszy, więc powinien nadal łamać wyjątek. – Robin

+0

Użyłem tego, aby złapać wyjątek serwletu w Eclipse, debugując problem, którego nie mogłem złapać w samym kodzie aplikacji. Wielkie dzięki za tę wskazówkę! –

1

Wystarczy podłączyć źródło (lub użyć czegoś, co automatycznie przywiązuje słoik źródłowy), a następnie ustawić punkt przerwania w normalny sposób, poprzez dwukrotne kliknięcie na lewo od linii interesów.

+0

Ta metoda bardzo mi pomogła podczas debugowania aplikacji połączonej z projektem Open Source. W moim przypadku mam (a) słoik z klasami, (b) słoik z odpowiednimi źródłami i (c) rozpakowałem źródła na mój dysk lokalny. Aby umieścić punkt przerwania na funkcji w projekcie Open Source, I (1) otworzył plik lokalnego napędu lokalnego w Eclipse i (2) umieścił punkt przerwania w żądanej linii funkcyjnej. Kiedy uruchamiałem moją aplikację, Eclipse był na tyle sprytny, aby przełamać się w pożądanym momencie. –

1

Aby to działało z zmaterializowaną aplikacją internetową, musiałem zrobić trzy rzeczy.

1) Utwórz nowy projekt zaćmienia za pomocą kodu źródłowego słoika innej firmy.

2) Usuń odwołanie do pliku jar z zależności pom.xml.

3) Dodaj nowy projekt zaćmienia do zestawu wdrażania we właściwościach projektu.

4) Dodaj nowy projekt zaćmienia do projektu Właściwości -> Ścieżka budowania Java -> Projekty istniejącego projektu, który odwołuje się do projektu strony trzeciej.

Jeśli trzeci projekt został poprawnie dodany do twojego repozytorium, przy użyciu źródeł, maven automatycznie pobierze odpowiedni kod źródłowy i pozwoli dodać punkty przerwania bez konieczności wykonywania żadnego z powyższych kroków; jednak nauczyłem się, że nie zawsze można na to liczyć.

Powiązane problemy