2014-07-08 16 views
8

Questa potrebbe essere una domanda un po 'strana, non riesco a cercare la frase giusta per ottenere risposte pertinenti.Javascript: traccia dello stack di debug con le mappe di origine

Abbiamo un'app che funziona su macchine client e viene ridotta. Generiamo mappe di origine, ma non sono esposte alle versioni di produzione.

Ho un window.onerror che uso un codice tutto per codice sciatto che trova il modo non riconoscibile da me. Per fortuna, questo non è quasi mai utilizzato. Recentemente, ho riscontrato un errore di tipo undefined di tanto in tanto, in modo che qualcuno abbia trovato un modo per fare qualcosa che non è inteso. Chrome fa un buon lavoro registrando il numero di righe e colonne nello stack trace che registriamo su un server di logging quando onerror cattura uno di questi buggers, ma è tutto quello di cui devo fare il debug e guardare attraverso un file min è meno attraente. E undefined is not a function non è molto utile :)

Domanda: c'è uno strumento là fuori - forse in nodejs - che può richiedere un file min, una mappa sorgente e una stringa di traccia stack e produrre file, numeri di linea e file rilevanti numeri di colonna?

Mi rendo conto che il browser lo fa per te in fase di runtime, ma in questo caso non ho quel lusso in quanto sto cercando di capire qual è effettivamente l'errore dopo il fatto.

risposta

6

trovato questo: https://github.com/thlorenz/stack-mapper

Io uso uglify che sembra produrre la mappatura corretta che questo ha bisogno e sembra che funzionerà per il caso ho suggerito sopra.

Modifica In realtà, questo funziona molto meglio ed è molto più semplice da usare https://github.com/mozilla/source-map/.

Esempio di utilizzo:

var fs = require('fs'); 
var smc = require('source-map'); 

var stack = "TypeError: undefined is not a function\r\nat h/min/min.js?1404839824760:9:23048"; 
stack = stack.split(/\r\n/g); 
var error = stack.shift(); // First line is the actual error 

var errors = []; 
var file = null; 

stack.forEach(function(line){ 
    var _trace = line.split('/').pop(); 
    var trace = {}; 
    trace.filename = _trace.split('?').shift(); 
    _trace = _trace.split(':'); 
    trace.line = parseInt(_trace[1], 10); 
    trace.column = parseInt(_trace[2], 10); 
    errors.push(trace); 

    if(!file) 
     file = trace.filename.split('.').shift(); 

    trace.filename = __dirname + '/../min/' + trace.filename; 
}); 

// This does not account for multiple files in stack trace right now 
var map = fs.readFileSync(__dirname + '/../src/' + file + '.js.map'); 
map = JSON.parse(map); 
var sm = new smc.SourceMapConsumer(map); 
console.log(sm.originalPositionFor(errors[0])); 
+0

Dal momento che questo è il codice NodeJs, significa che le sourcemaps devono essere elaborati sul server? – Aligned

+0

@Aligned Sembra che tu abbia risposto alla tua stessa domanda. –

2

stacktrace.js sembra essere un altro strumento utile per raggiungere questo obiettivo.

Esempio dal loro sito:

var error = new Error('BOOM!'); 
StackTrace.fromError(error).then(callback).catch(errback) 
=> Promise(Array[StackFrame], Error); 
Problemi correlati