Framework-agnostic, micro-library for getting stack traces in all environments
npm install stacktrace-js






Debug and profile your JavaScript with a stack trace of function calls leading to an error (or any condition you specify).
stacktrace.js uses browsers' Error.stack mechanism to generate stack traces, parses them, enhances them with
source maps and uses
Promises
to return an Array of StackFrames.
#### Upgrading? Check the 0.x -> 1.x Migration Guide
js
var callback = function(stackframes) {
var stringifiedStack = stackframes.map(function(sf) {
return sf.toString();
}).join('\n');
console.log(stringifiedStack);
};var errback = function(err) { console.log(err.message); };
StackTrace.get().then(callback).catch(errback);
//===> Promise(Array[StackFrame], Error)
//===> callback([
// StackFrame({functionName: 'func1', args: [], fileName: 'file.js', lineNumber: 203, columnNumber: 9}),
// StackFrame({functionName: 'func2', args: [], fileName: 'http://localhost:3000/file.min.js', lineNumber: 1, columnNumber: 3284})
//])
`#### You can also get a stack trace synchronously
HEADS UP: This method does not resolve source maps or guess anonymous function names.
`js
StackTrace.getSync();
//==> [
// StackFrame({functionName: 'func1', args: [], fileName: 'file.js', lineNumber: 203, columnNumber: 9}),
// StackFrame({functionName: 'func2', args: [], fileName: 'http://localhost:3000/file.min.js', lineNumber: 1, columnNumber: 3284})
//]
`#### window.onerror integration
Automatically handle errors
`js
window.onerror = function(msg, file, line, col, error) {
// callback is called with an Array[StackFrame]
StackTrace.fromError(error).then(callback).catch(errback);
};
`#### Get stack trace from an Error
`js
var error = new Error('BOOM!');StackTrace.fromError(error).then(callback).catch(errback);
//===> Promise(Array[StackFrame], Error)
`#### Generate a stacktrace from walking arguments.callee
This might capture arguments information, but isn't supported in ES5 strict-mode
`js
StackTrace.generateArtificially().then(callback).catch(errback);
//===> Promise(Array[StackFrame], Error)
`#### Trace every time a given function is invoked
`js
// callback is called with an Array[StackFrame] every time wrapped function is called
var myFunc = function(arg) { return 'Hello ' + arg; };
var myWrappedFunc = StackTrace.instrument(myFunc, callback, errback);
//===> Instrumented Function
myWrappedFunc('world');
//===> 'Hello world'// Use this if you overwrote you original function
myFunc = StackTrace.deinstrument(myFunc);
//===> De-instrumented Function
`Get stacktrace.js
`
npm install stacktrace-js
bower install stacktrace-js
component install stacktracejs/stacktrace.js
http://cdnjs.com/libraries/stacktrace.js
`API
####
StackTrace.get(/optional/ options) => Promise(Array[StackFrame])
Generate a backtrace from invocation point, then parse and enhance it.(Optional) options: Object
filter: Function(StackFrame => Boolean)* - Only include stack entries matching for which
filter returns true
sourceCache: Object (String URL => String Source)* - Pre-populate source cache to avoid network requests
offline: Boolean (default: false)* - Set to true to prevent all network requests####
StackTrace.getSync(/optional/ options) => Array[StackFrame]
Generate a backtrace from invocation point, then parse it. This method does not use source maps or guess anonymous functions. (Optional) options: Object
filter: Function(StackFrame => Boolean)* - Only include stack entries matching for which
filter returns true####
StackTrace.fromError(error, /optional/ options) => Promise(Array[StackFrame])
Given an Error object, use error-stack-parser
to parse it and enhance location information with stacktrace-gps.error: Error
(Optional) options: Object
filter: Function(StackFrame => Boolean)* - Only include stack entries matching for which
filter returns true
sourceCache: Object (String URL => String Source)* - Pre-populate source cache to avoid network requests
offline: Boolean (default: false)* - Set to true to prevent all network requests####
StackTrace.generateArtificially(/optional/ options) => Promise(Array[StackFrame])
Use stack-generator to generate a backtrace by walking the arguments.callee.caller chain.(Optional) options: Object
filter: Function(StackFrame => Boolean)* - Only include stack entries matching for which
filter returns true
sourceCache: Object (String URL => String Source)* - Pre-populate source cache to avoid network requests
offline: Boolean (default: false)* - Set to true to prevent all network requests####
StackTrace.instrument(fn, callback, /optional/ errback) => Function
* Given a function, wrap it such that invocations trigger a callback that is called with a stack trace.* fn: Function - to wrap, call callback on invocation and call-through
* callback: Function - to call with stack trace (generated by
StackTrace.get()) when fn is called
* (Optional) errback: Function - to call with Error object if there was a problem getting a stack trace.
Fails silently (though fn is still called) if a stack trace couldn't be generated.####
StackTrace.deinstrument(fn) => Function
Given a function that has been instrumented, revert the function to it's original (non-instrumented) state.* fn: Function - Instrumented Function
####
StackTrace.report(stackframes, url, message, requestOptions) => Promise(String)
Given an an error message and Array of StackFrames, serialize and POST to given URL. Promise is resolved with response text from POST request.Example JSON POST data:
`
{
message: 'BOOM',
stack: [
{functionName: 'fn', fileName: 'file.js', lineNumber: 32, columnNumber: 1},
{functionName: 'fn2', fileName: 'file.js', lineNumber: 543, columnNumber: 32},
{functionName: 'fn3', fileName: 'file.js', lineNumber: 8, columnNumber: 1}
]
}
`* stackframes: Array(StackFrame) - Previously wrapped Function
* url: String - URL to POST stack JSON to
* message: String - The error message
* requestOptions: Object - HTTP request options object. Only
headers: {key: val}` is supported.> HEADS UP: You won't get the benefit of source maps
in IE9- or other very old browsers.
Want to be listed as a Contributor? Start with the Contributing Guide!
This project is made possible due to the efforts of these fine people:
* Eric Wendelin
* Victor Homyakov
* Oliver Salzburg
* Many others