2012-08-15 3 views
6

Ich habe eine Javascript-Anwendung, die auf die Erfassung von Tastaturereignissen in einem Textfeld basiert. Beim Testen und Debuggen von Firefox (14.x) mit Firebug (1.10.2) habe ich festgestellt, dass sich meine Anwendung anders verhält, wenn ich Breakpoints aktiv habe und der Debugger funktioniert.Ermitteln, wann Firebug (oder ein anderer Web-Debugger) zum Debuggen verwendet wird

Ich weiß, wie man Firebug erkennt, aber ich würde gerne wissen, ob es möglich ist (mit Javascript) zu erkennen, wann der Firebug tatsächlich zum Debuggen verwendet wird?

Edit:. Hier ist ein Beispiel auf einem zufälligen Ort

This site fängt das Schlüsselereignis in einem Eingabefeld druckt Zeichencode und ersetzt die gedrückte Taste mit einer Textdarstellung (dh „Enter“ für Enter-Taste) oder Großbuchstaben (wenn ein Buchstabe).

Wenn ich es mit Chrome debuggen und einen Haltepunkt auf die Listener-Funktion platzieren, geschieht nichts, wenn der Haltepunkt erreicht ist (wie erwartet), wenn ich das Skript wiederbetrete, wird der Text wie normal ausgedruckt.

Wenn ich es mit Firebug auf Firefox debuggen: Sagen wir, dass ich vorher den Buchstaben "e" gedrückt habe und die Eingabezeile Text "E" enthält. Ich schalte den Haltepunkt ein und drücke den Buchstaben "z". Firebug stoppt am Haltepunkt, aber die Eingabezeile hat jetzt den Text "Ez" anstelle von "E". Wenn ich das Skript fortsetze, wird dieser Text wie erwartet durch "Z" ersetzt.

Ich probierte einen anderen Firefox-Debugger (Venkman 0.9.89) und das gleiche passierte. Ich vermute, das ist ein Firefox-Problem, nicht das Debugger-Problem. Die Frage könnte also allgemeiner sein, kann man feststellen, wann der Javascript-Code debuggt wird?

+13

Dies ist eine * sehr * ungerade Anforderung.Wie verhält sich Ihre Anwendung anders? Vielleicht sollten Sie das Verhalten Ihrer Anwendung ansprechen und beheben, anstatt zu versuchen, sie zu umgehen. Normalerweise sollte sie sich beim Debuggen nicht anders verhalten, und vielleicht liegt ein architektonisches Problem dahinter. Und was ist mit den vielen anderen Debuggern da draußen? Sie müssten sie alle erkennen ... –

+0

Funktioniert es anders, wenn Firebug funktioniert, auch wenn Sie keine Breakpoints oder andere Unterschiede zu Firebug-Runs haben? –

+0

Ich nehme das Ereignis auf, verarbeite es und verhindere es. Beim Debuggen der Methode, die die Arbeit erledigt, passiert das Ereignis tatsächlich, bevor meine Methode aufgerufen wird, daher kann ich es nicht verhindern. Da meine Anwendung funktioniert, während Firebug ausgeschaltet ist, vermutete ich, dass dieses Verhalten kein Firefox-Problem war. Einen anderen Debugger zu finden kam mir nicht in den Sinn, danke für die Idee! Während Firebug eingeschaltet ist, aber nicht debuggt, funktioniert alles einwandfrei. – Bikush

Antwort

2

Dies ist, was ich tun Firebug zu erkennen:

if (window.console && (window.console.firebug || window.console.exception)) { 
    // At this point, Firebug is enabled 
} 

Der erste Test wichtig, um sicherzustellen, dass die Konsole tatsächlich existiert die zweite für Firebug testen, auch wenn es nur für ältere Versionen von arbeiten es. Die dritte ist da als Firebug fügt die "Ausnahme" Dies ist, weil die Eigenschaft "Ausnahme" von Firebug-Plugin hinzugefügt wird.

(Unrelated aber interessiert. window.console.exception ist die Methode, mit Firebug verwendet, um eine Nachricht auf der Konsole angezeigt werden Sie beispielsweise:

>>> window.console.exception("A message", {param:'Value'}) 

Sie einen Fehler sehen, die sehr vertraut aussehen wird, mit einer Müllhalde des übergebenen Objekt!

Merc.

+0

Wie ich in meiner Frage erwähnte, weiß ich über diesen Scheck. Danke jedenfalls! Da Firebug-Entwickler das Firebug-Objekt aus der window.console entfernt haben, wird jemand Probleme damit haben und diese Antwort möglicherweise nützlich finden. – Bikush

+0

Ich sehe keinen Verweis auf 'window.console.exception' noch auf' window.console.firebug' in Ihrer Frage! Aber ich könnte blind sein. Bitte akzeptiere meine Antwort, wenn du denkst, dass sie die Frage beantwortet! – Merc

+0

Meine Frage war, wie man den tatsächlichen Debugging-Prozess erkennt, nicht die Anwesenheit des Firebug. – Bikush

0

Nun, hoffen, dass diese Antwort jemand helfen.

Let Funktion wir debuggen wie:

function debugged() 
{ 
    debugger; 
} 
setTimeout(debugged, 3000); 

diesen Debug-Erkennungscode hinzufügen ist:

setTimeout(this.x = function(a){ s = Math.abs(new Date() - a.c - 1000); a.c = new Date(); setTimeout(a.foo,1000, a); if(s>100)console.log("debug") },1000, {c: new Date(), foo:this.x}) 

so, wenn wir es in einem Ort und offenen Debugger ausführen, wird es auslösen Breakpoint und Debug-Ereignis wird eingefangen werden (Sie können sehen Sie es durch "debug" Wort in der Konsole angezeigt). Dies ist ein Konzept, Sie können die Zeit für die Erkennung ändern und einen Debug-Flag auslösen. Dank single-threaded Javascript.

Verwandte Themen