javascript / expert
Snippet
Benutzerdefinierte CallSite-Inspektion mit V8 Error.prepareStackTrace
V8 ermöglicht die Anpassung der Stack-Trace-Generierung über Error.prepareStackTrace. Durch Überschreiben dieser Eigenschaft gibt die stack-Eigenschaft strukturierte CallSite-Objekte anstelle eines formatierten Strings zurück, was das programmgesteuerte Tracing von Aufruforten, Dateinamen und Zeilennummern erlaubt.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
function getCallerLocation() {const original = Error.prepareStackTrace;Error.prepareStackTrace = (err, stack) => stack;const err = new Error();Error.captureStackTrace(err, getCallerLocation);const stack = err.stack;Error.prepareStackTrace = original;return {file: stack[0].getFileName(),line: stack[0].getLineNumber(),func: stack[0].getFunctionName() || 'anonymous'};}
nodejs
Erklärung
1
const original = Error.prepareStackTrace;
Speichert den Standard-Stack-Trace-Formatierer zur späteren Wiederherstellung.
2
Error.prepareStackTrace = (err, stack) => stack;
Ersetzt die Standardformatierung durch eine Funktion, die rohe CallSite-Objekte zurückgibt.
3
Error.captureStackTrace(err, getCallerLocation);
Erfasst den Stack-Trace und lässt Frames bis getCallerLocation aus.
4
Error.prepareStackTrace = original;
Stellt den ursprünglichen Handler wieder her, um globale Seiteneffekte zu vermeiden.
5
file: stack[0].getFileName()
Greift auf CallSite-Methoden zu, um Dateinamen und Zeilenmetadaten des Aufrufers zu extrahieren.