2010-08-12 2 views
11

Ich habe eine Webanwendung, wo ich alle Klassen finden muss, die auf das http-Anfrageobjekt zugreifen (weil einer von ihnen einen schwer zu findenden Fehler verursacht). Daher möchte ich in einigen Methoden der ServletRequest-Implementierung einen Haltepunkt setzen. Diese Implementierung wird jedoch von Weblogic bereitgestellt, für die ich keine Quellen habe. Wie kann ich einen Haltepunkt in einer Klasse an einer beliebigen Stelle in einer bestimmten Methode platzieren, ohne die Quelle zu haben? Die Eclipse-IDE wird bevorzugt.Wie bringe ich den Breakpoint in die Klasse, ohne dass er seine Quelle hat?

Antwort

17

Sie können einen Methodenhaltepunkt mithilfe der Gliederungsansicht der betreffenden Klasse festlegen. Dann bricht der Debugger in der ersten Zeile der Methode.

+0

cool, ich wusste das nicht :) +1 – Bozho

+1

Aus irgendeinem Grund das Rechtsklick-Menü für die Methode enthält nicht "Umschaltmethode Haltepunkt" auf einem neuen Arbeitsbereich, sondern zeigt nach einem anderen Haltepunkt wurde festgelegt. –

0

Ich fürchte, Sie werden den Quellcode benötigen, wenn Sie möchten, dass dies funktioniert.

Zum Debuggen benötigen Sie lesbaren Code + Zeilennummern, die mit diesem Code übereinstimmen. Keines dieser Elemente ist in den Klassendateien enthalten.

+0

Glücklicherweise ist das nicht wahr. Siehe Thorbjørn Ravn Andersens Antwort! – vol

1

Je nach Ihrem Glück können Sie dies mit a decompiler tun. Sie müssen den Haltepunkt in der entsprechenden Zeile platzieren (die leider keinen "Breakpoint" -Code enthält)

Der bessere Weg, dies zu tun, ist eine ServletResponse Wrapper erstellen. Übrigens, gestern habe ich eine solche Sache (mit einem etwas anderen Zweck), also hier ist es:

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

Das Problem mit dem Wrapper-Ansatz ist, dass ich bereits Wrapper in meiner Anwendung habe, aber irgendein Framework funktioniert irgendwie direkt auf der ursprünglichen Anfrage - das ist der Fehler :-). –

Verwandte Themen