2015-10-14 4 views
14

Auf unserem Produktionsserver habe ich Javascript minimiert veröffentlicht und ich schließe keine Map-Datei mit ein, da ich nicht möchte, dass der Benutzer aufgrund des Fehlers verstehen kann, was passiert.Wie kann ich eine minimierte JavaScript-Stack-Trace und führen Sie es gegen eine Quellkarte, um den richtigen Fehler zu erhalten?

Ich habe einen Protokolldienst, den ich geschrieben habe, um die Winkelausnahmen (gefangen von $ exceptionHandler) an mich per E-Mail weiterzuleiten. Allerdings ist dieser Stack-Trace in der Nähe von unlesbaren:

n is not defined 
    at o (http://localhost:9000/build/app.min.js:1:3284) 
    at new NameController (http://localhost:9000/build/app.min.js:1:3412) 
    at e (http://localhost:9000/build/bower.min.js:44:193) 
    at Object.g.instantiate (http://localhost:9000/build/bower.min.js:44:310) 
    at b.$get (http://localhost:9000/build/bower.min.js:85:313) 
    at d.compile (http://localhost:9000/build/bower.min.js:321:23333) 
    at aa (http://localhost:9000/build/bower.min.js:78:90) 
    at K (http://localhost:9000/build/bower.min.js:67:39) 
    at g (http://localhost:9000/build/bower.min.js:59:410) 
    at http://localhost:9000/build/bower.min.js:58:480 <ui-view class="ng-scope"> 

Was ich frage mich, ist: Gibt es ein Programm, in dem ich diesen Stack-Trace gegen den tatsächlichen nicht-minimierte Quellcode über Map-Datei (oder auch nicht über Karte analysieren Datei, wenn es einen anderen Weg gibt)

+0

ich einige geeignete Werkzeuge für dieses Problem finden: - http://www.stacktracejs.com/ - http://sourcemaps.info/ (auf GitHub: https://github.com/bugsnag/sourcemaps .info) Dies kann den verkleinerten Stack-Trace in den Entwicklungs-Stack-Trace konvertieren. –

+0

sourcemaps.info macht genau das, was das OP gefragt hat und was ich gebraucht habe. Vielen Dank! Ein Tipp, weil ich zuerst geworfen wurde: Sie brauchen keine öffentlich zugänglichen Quellkarten. Nach dem Einfügen in Ihren Stack-Trace, wenn er sie nicht finden kann, erhalten Sie eine Box, um die Quellkarte manuell einzufügen. Kein großartiges UX, und es verbraucht ständig CPU, aber die Funktionalität ist genau richtig :). –

+0

Haben Sie eine Lösung für dieses Problem gefunden? –

Antwort

-1

Append-Anweisung für das JS, das auf der Seite ausgeführt wird.

// # sourceMappingURL =/path/to/your/sourcemap.map

In firefox (nicht sicher Chrom), um den Debugger zu sagen Quelle Karten zu verwenden, wenn sie verfügbar sind, klicken Sie auf die "Debugger-Einstellungen" Wählen Sie "Originalquellen anzeigen" aus der Liste der Einstellungen:

+1

Das ist in Ordnung, wenn ich die Quellkarten funktionieren soll, wenn die Anwendung ausgeführt wird, aber ich möchte nicht, dass der Benutzer die Quellkarte hat . Ich möchte nur in der Lage sein, den Stack-Trace zu analysieren –

1

Wenn Sie extern Zugriff auf die Quellkartendatei hatten und die gleiche Dateistruktur erhalten könnten, könnten Sie es ausrechnen, denke ich, aber ich bin keine Tools außerhalb des Browsers, die Ihnen dabei helfen.

Der zusätzliche Vorteil, die Daten in einem laufenden Browser zu haben, ermöglicht das Überprüfen von Einträgen, die Sie selbst mit einer Quellkarte nicht erhalten.

Sie könnten ein Tool wie rollbar für die Fehlerberichterstattung in Betracht ziehen. Dies meldet alle Locals in jedem Frame, um das Debuggen zu unterstützen. Es unterstützt , um Ihre Sicherheitsprobleme zu beheben.

+0

Danke für den Vorschlag! Das wäre ziemlich nützlich, aber unsere Firma würde wahrscheinlich die Unternehmenslizenz von Überrollschutz verlangen, und ich bezweifle, dass ich meinen Chef davon überzeugen konnte, 1000 Dollar pro Monat dafür auszugeben. Es ist definitiv eine Lösung, obwohl –

+0

Das ist definitiv eine Menge zu zahlen, nur um herauszufinden, wo dieser Fehler auftritt! – Euan

+1

Ja, genau. Und dieser spezifische Fehler ist einer, den ich absichtlich verursacht habe, um einen Punkt zu beweisen. Unsere App ist Monate von der Produktion entfernt, aber ich versuche, eine gute Fehlerbehebungslösung früh im Prozess zu nageln. –

9

Was Sie tun möchten, ist die Parsing der Quellkarten. Dies hat nichts mit Webbrowsern zu tun. Alles, was Sie tun müssen, ist die minimierte Referenz in die unminifizierte Ressource zu übersetzen.

Wenn Sie Erfahrung mit NodeJS haben, gibt es bereits ein Paket, das dies für Sie erledigt.

https://github.com/mozilla/source-map/

Um die Bibliothek

npm install -g source-map 

Erstellen Sie eine Datei mit dem Namen "issue.js"

fs = require('fs'); 
var sourceMap = require('source-map'); 
var smc = new sourceMap.sourceMapConsumer(fs.readFileSync("./app.min.js.map","utf8")); 
console.log(smc.originalPositionFor({line: 1, column: 3284})); 

Führen Sie die Datei mit dem Knoten

node issue.js 

Es zu installieren sollte den Speicherort in der ursprünglichen Datei für die erste Zeile aus der Stack-Ablaufverfolgung an die Konsole ausgeben.

Hinweis: Ich sage Ihnen, dass Sie Source-Map global zur einfacheren Verwendung installieren, aber Sie könnten ein Knotenprojekt erstellen, das das tut, was Sie brauchen, und es lokal installiert.

+0

Das ist eine großartige Idee. Ich hoffe, es gibt etwas, das ich verwenden kann, um eine ganze Stack-Trace zu analysieren, aber ich denke, ich könnte etwas schreiben, um die Stack-Trace Zeile für Zeile zu lesen, um die gleiche Idee zu machen. Danke für den Vorschlag! –

+0

Google Nodejs liest Zeile um Zeile und dann Regex-Übereinstimmung zwischen '(..)' und Sie haben Ihre Stack-Trace aus einer Textdatei. – cgTag

+0

Ja, das ist genau das, was ich vorhabe. –