2012-04-06 5 views
5

Ho notato che con Firefox/Firebug (il mio ambiente di sviluppo principale), alcuni errori producono tracce di stack, mentre altri no. All'inizio ho pensato che questo avesse qualcosa a che fare con se ho generato l'errore (ad esempio new Error ("foo")) o se Javascript lo ha generato (ad esempio undefinedFoo + = 1), ma ho notato che sta accadendo con entrambi i tipi di errori.Con Firefox/Firebug, Perché ottieni solo stacktraces con alcuni errori

Quindi, la mia domanda è, qualcuno sa che cosa causa questo? È casuale o c'è qualche schema/logica? Solo Firefox e/o Firebug sono zoppi o altri browser lo fanno? E, cosa più importante, c'è qualcosa che posso fare per controllarlo (in particolare per farmi sempre dare le tracce dello stack)?

Questa non è una domanda cruciale (dato che posso sempre lanciare un "console.trace()" appena prima che si verifichi l'errore), ma sono curioso se qualcuno conosce la risposta.

********** ********** EDIT

ho trovato questa discussione: http://groups.google.com/group/firebug/browse_thread/thread/1f32df8b96ec1d30/64b9074cb99056c2?pli=1 che menziona che Firefox non fornisce Firebug con stacktraces se la l'errore non è un'istanza di errore. In altre parole, se lanci qualcosa che non è un nuovo errore ("pippo"), non otterrai uno stacktrace.

Tuttavia, questo non mi aiuta, poiché non vedo gli stacktraces neanche quando lancio un nuovo Errore().

+0

Anche se dubito che sia importante, dovrei probabilmente menzionare che sono su Linux (nella remota possibilità che Firefox abbia un bug specifico per Linux con la perdita dello stacktrace). – machineghost

+0

Sono l'unico a vedere errori di stack-trace-less in Firefox? O gli altri li vedono, e nessuno sa perché Firefox lo fa? – machineghost

+1

Ho trovato una risposta parziale. Si scopre che Firebug ha una preferenza "segreta" (ad esempio about: config) che non mostra stacktraces: extensions.firebug.showStackTrace. Quando ho controllato il mio about: config, ho scoperto che questa preferenza era impostata su false (il che è strano, dato che non ricordo di averlo mai fatto ...). Tuttavia, anche con esso impostato su true (e anche dopo aver riavviato Firefox) non vedo ancora tracce di stack su alcuni errori :-( – machineghost

risposta

2

L'ho trovato! Risulta che il modello del modulo è il problema. Ecco un semplice esempio:

var OuterModule = (function(module){ 
    module.throwError = function() { 
     throw new Error("This has no stack trace!"); 
    }; 
    return module; 
})({}); 
OuterModule.throwError(); 

Per qualche ragione, perché il modello del modulo nasconde throwError funzione all'interno portata del modulo, Firebug/Firefox è in grado di tracciare in modo corretto.

L'uomo che ha preso per sempre troppo capire; speriamo che qualcun altro tragga beneficio dalla mia sofferenza :-)

+0

Come nota a margine, questo non è chiaramente un limite intrinseco di Firebug/Firefox, perché se aggiungi un "console.trace()" proprio prima di lanciare il nuovo errore, otterrai una traccia di stack perfettamente utilizzabile, quindi il problema non è che Firefox non possa gestire tracce di stack originate da "moduli"; il problema è che Firefox sembra avere difficoltà a connettere le tracce dello stack agli errori che si verificano all'interno dei "moduli". – machineghost

+0

Ho notato un comportamento simile e ho anche avuto la sensazione che fosse correlato agli errori dell'applicazione lanciati con ** nuovo errore ** in opposizione all'errore gettato dal sistema - Grazie per questo post! –