2014-07-08 3 views
8

Dies kann ein bisschen eine seltsame Frage sein, kann ich nicht scheinen, die richtige Phrase zu suchen, um relevante Antworten zu ziehen.Javascript: debug Stapel Trace mit Quellkarten

Wir haben eine App, die auf Client-Computern ausgeführt wird und minimiert wird. Wir erzeugen Quellkarten, die jedoch keinen Produktionsversionen ausgesetzt sind.

Ich habe eine window.onerror, dass ich einen Haken alle für schlampigen Code verwenden, die es in unbekanntem Weg zu mir findet. Zum Glück wird dies fast nie genutzt. Kürzlich habe ich einen undefined Fehler bekommen, der gelegentlich auftaucht, also hat jemand einen Weg gefunden, etwas zu tun, das nicht beabsichtigt ist. Chrome macht einen netten Job und zeichnet Zeilen- und Spaltennummern im Stack-Trace auf, die wir auf einem Logging-Server protokollieren, wenn onerror einen dieser Bugger abfängt, aber das ist alles, womit ich debuggen muss, und das Durchsehen einer Min-Datei ist weniger als ansprechend. Und undefined is not a function ist nicht sehr hilfreich auch :)

Frage: gibt es ein Tool da draußen - vielleicht in Nodejs - das kann eine min-Datei, Quell-Map und eine Stapel-Trace-String und produzieren relevante Dateien, Zeilennummern und Spaltennummern?

Ich weiß, dass der Browser dies für Sie zur Laufzeit tut, aber in diesem Fall habe ich nicht diesen Luxus, wie ich versuche herauszufinden, was der Fehler tatsächlich nach der Tat ist.

Antwort

6

Gefunden dies: https://github.com/thlorenz/stack-mapper

Ich benutze verunstalten, um die korrekte Zuordnung zu erzeugen scheint, dass dies braucht und es sieht aus wie es für den Fall arbeiten werde ich oben vorgeschlagen.

bearbeiten Eigentlich funktioniert dies ein viel besser und ist viel einfacher https://github.com/mozilla/source-map/ zu verwenden.

Verwendungsbeispiel:

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

Da dies NodeJS Code, ist, dass die sourcemaps bedeuten sollte auf dem Server bearbeitet werden? – Aligned

+0

@Aligned Sieht aus, als ob Sie Ihre eigene Frage beantwortet haben. –

2

stacktrace.js sieht ein weiteres nützliches Instrument, um dies zu erreichen.

Beispiel von ihrer Website:

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