2012-08-15 14 views
6

Mam aplikację JavaScript, która polega na przechwytywaniu zdarzeń klawiatury w obszarze tekstowym. Podczas testowania i debugowania go w Firefoksie (14.x) za pomocą firebuga (1.10.2) zauważyłem, że moja aplikacja zachowuje się inaczej, gdy mam aktywne punkty przerwania i działa debugger.Wykryj, kiedy Firebug (lub inny debuger internetowy) używany do debugowania

W jaki sposób wykrywać Firebuga, ale chciałbym wiedzieć, czy możliwe jest wykrycie (z Javascriptem), gdy Firebug jest rzeczywiście używany do debugowania?

Edit. Oto przykład na jakiejś przypadkowej stronie

This site połowy kluczowym wydarzeniem w polu tekstowym, wypisuje kod znaku i zastępuje wciśnięty klawisz z reprezentacji tekstowej (tj „enter” dla klawisz Enter) lub wielką literą (jeśli jest to litera).

Kiedy debuguję go w przeglądarce Chrome i umieszczam punkt przerwania w funkcji słuchacza, nic się nie dzieje po osiągnięciu punktu przerwania (zgodnie z oczekiwaniami), kiedy wznawiam skrypt, tekst jest drukowany normalnie.

Kiedy debuguję go Firebug w Firefoksie: Powiedzmy, że wcześniej naciskałem literę "e", a pasek wprowadzania zawiera tekst "E". Włączyć punkt przerwania i nacisnąć literę "z". Firebug zatrzymuje się w punkcie przerwania, ale pasek wprowadzania ma teraz tekst "Ez" zamiast "E". Kiedy wznowię skrypt, tekst ten zostanie zastąpiony przez "Z" zgodnie z oczekiwaniami.

Wypróbowałem inny debugger Firefox (Venkman 0.9.89) i to samo się stało. Zgaduję więc, że jest to problem z Firefoksem, a nie problem z debuggerem. Pytanie może być bardziej ogólne, czy można je wykryć, gdy debugowany jest kod Javascript?

+13

To jest * bardzo * wymaganie nieparzyste.Jak Twoja aplikacja zachowuje się inaczej? Być może powinieneś raczej zaadresować i naprawić zachowanie aplikacji, niż próbować ją obejść - zwykle nie powinno zachowywać się inaczej podczas debugowania i być może za tym stoi problem architektoniczny. A co z wieloma innymi debuggerami? Musiałbyś je wszystkie wykryć ... –

+0

Czy działa inaczej, gdy Firebug działa, nawet jeśli nie masz żadnych punktów przerwania ani innych różnic w porównaniu z przebiegami innymi niż Firebug? –

+0

Przechwytywam zdarzenie, przetwarzam je i zapobiegam. Podczas debugowania metody, która wykonuje pracę, zdarzenie faktycznie dzieje się przed wywołaniem mojej metody, dlatego nie jestem w stanie temu zapobiec. Ponieważ moja aplikacja działa, gdy Firebug jest wyłączony, przypuszczam, że to zachowanie nie było problemem w Firefoksie. Znalezienie innego debuggera nie przyszło mi do głowy, dziękuję za pomysł! Ponadto, gdy Firebug jest włączony, ale nie ma debugowania, wszystko działa poprawnie. – Bikush

Odpowiedz

2

To co mam zrobić, aby wykryć Firebug:

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

Pierwszy test jest bardzo ważne, aby upewnić się, że konsola faktycznie istnieje drugi będzie testować na Firebug, chociaż to będzie działać tylko dla starszych wersji to. Trzeci jest tam, gdy Firebug dodaje "wyjątek". Dzieje się tak, ponieważ właściwość "wyjątek" jest dodana przez wtyczkę Firebug.

(niepowiązany ale interesuje. window.console.exception jest metoda stosowana przez Firebug, aby wyświetlić komunikat na konsoli Na przykład wpisz:

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

Zobaczysz błąd, który będzie wyglądać bardzo dobrze zaznajomieni z wysypisko od przekazany obiekt!

Merc.

+0

Jak wspomniałem w moim pytaniu, wiem o tym sprawdzeniu. Dzięki i tak! Ponieważ programiści Firebug usunęli obiekt firebug z window.console, ktoś będzie miał z tym problemy i może ci się przydać ta odpowiedź. – Bikush

+0

Nie widzę odniesienia do 'window.console.exception' ani do' window.console.firebug' w twoim pytaniu! Ale mogę być ślepy. Proszę przyjąć moją odpowiedź, jeśli uważasz, że odpowiada na pytanie! – Merc

+0

Moje pytanie brzmi: jak wykryć rzeczywisty proces debugowania, a nie obecność Firebug. – Bikush

0

Well nadzieję, że to pomoże ktoś odpowiedź.

funkcja Let my do debugowania być takie jak:

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

dodać ten kod detekcji debug jest:

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}) 

więc jeśli uruchomić go w jakimś miejscu i otworzyć debuggera, to spowoduje przerwania i zdarzeń debugowania zostanie przechwycony (można zobacz to przez słowo "debug" pojawiające się w konsoli). To jest koncepcja, możesz zmienić czas wykrywania i sposób podniesienia flagi debugowania. Dzięki jednowątkowemu javascript.

Powiązane problemy