2010-08-12 13 views
11

Mam aplikację internetową, w której muszę znaleźć wszystkie klasy, które uzyskują dostęp do obiektu żądania http (ponieważ jeden z nich powoduje trudny do znalezienia błąd). Dlatego chciałbym umieścić punkt przerwania w niektórych metodach implementacji ServletRequest. Tę implementację zapewnia jednak Weblogic, dla której nie mam źródeł. W jaki sposób można umieścić punkt przerwania w klasie w dowolnym miejscu w danej metodzie, nie posiadając jej źródła. Preferowane jest środowisko IDE Eclipse.Jak umieścić punkt przerwania w klasie bez jego źródła?

Odpowiedz

17

Można ustawić punkt przerwania metody, korzystając z widoku konspektu danej klasy. Następnie debugger łamie się w pierwszym wierszu metody.

+0

fajne, tego nie wiedziałem :) +1 – Bozho

+1

Z jakiegoś powodu menu z prawym przyciskiem myszy dla tej metody nie zawiera "Toggle Method Breakpoint" w świeżym obszarze roboczym, ale pojawia się po ustawieniu innego punktu przerwania. –

0

Obawiam się, że będziesz potrzebował kodu źródłowego, jeśli chcesz, aby to działało.

Do debugowania potrzebny jest czytelny kod + numery linii pasujące do tego kodu. Żadna z tych pozycji nie jest zawarta w plikach klasowych

+0

Na szczęście nie jest to prawdą. Zobacz odpowiedź Thorbjørna Ravna Andersena! – vol

1

W zależności od szczęścia możesz to zrobić pod numerem a decompiler. Będziesz musiał umieścić punkt przerwania w odpowiedniej linii (która, niestety, może nie zawierać kodu "z przerwami").

Lepszym sposobem na zrobienie tego jest utworzenie opakowania typu ServletResponse. Nawiasem mówiąc, wczoraj stworzyłem coś takiego (z nieco innym celem), więc oto jest:

public class DebugFilter implements Filter { 

    public void init(FilterConfig filterConfig) {} 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws IOException, ServletException { 

     chain.doFilter(request, 
       new ResponseWrapper((HttpServletResponse) response)); 
    } 

    public void destroy() {} 
} 

class ResponseWrapper extends HttpServletResponseWrapper { 

    public ResponseWrapper(HttpServletResponse response) { 
     super(response); 
    } 

    @Override 
    public PrintWriter getWriter() throws IOException { 
     return super.getWriter(); // breakpoint here 
    } 

    // Override whichever methods you like 
} 
+0

Problem z otoką polega na tym, że mam już opakowanie w mojej aplikacji, ale niektóre ramy działają w jakiś sposób bezpośrednio na pierwotne żądanie - to błąd :-). –

Powiązane problemy