2014-07-08 20 views
8

To może być trochę dziwne pytanie, nie mogę znaleźć właściwej frazy, aby wyciągnąć odpowiednie odpowiedzi.JavaScript: śledzenie stosu debugowania z mapami źródłowymi

Mamy aplikację, która działa na komputerach klientów i jest zminimalizowana. Generujemy mapy źródłowe, ale nie są one narażone na wersje produkcyjne.

Mam window.onerror, że używam catch wszystkie dla niechlujny kod, który znajduje się w sposób bez wiedzy mnie. Na szczęście to prawie nigdy nie jest wykorzystywane. Ostatnio od czasu do czasu pojawiał się błąd o błędzie undefined, więc ktoś znalazł sposób na zrobienie czegoś, co nie było zamierzone. Chrome wykonuje dobrą pracę zapisując numer wiersza i kolumny w śladzie stosu, który rejestrujemy na serwerze rejestrowania, gdy onerror łapie jednego z tych buggerów, ale to wszystko, co muszę debugować, a przeglądanie pliku min jest mniej atrakcyjne niż. I undefined is not a function też nie jest zbyt pomocny :)

Pytanie: czy istnieje narzędzie - może w nodejs - które może pobrać plik min, mapę źródłową i ciąg śledzenia stosu i wygenerować odpowiednie pliki, numery linii i numery kolumn?

Zdaję sobie sprawę, że przeglądarka robi to za Ciebie w czasie wykonywania, ale w tym przypadku nie mam tego luksusu, ponieważ próbuję dowiedzieć się, jaki błąd faktycznie występuje po fakcie.

Odpowiedz

6

Znalazłem to: https://github.com/thlorenz/stack-mapper

używam zeszpecić co wydaje się produkować poprawne mapowanie, że potrzebuje i wygląda na to będzie pracować dla sprawy zasugerowałem wyżej.

Edit Faktycznie, działa o wiele lepiej i jest znacznie prostszy w użyciu https://github.com/mozilla/source-map/.

Przykład Zastosowanie:

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

Ponieważ jest to kod NodeJs, to znaczy z sourcemaps powinny być przetwarzane na serwerze? – Aligned

+0

@Aligned Wygląda na to, że odpowiadasz na własne pytanie. –

2

stacktrace.js wydaje się być inną użyteczne narzędzie do osiągnięcia tego celu.

Przykład z ich strony internetowej:

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