Monday, August 18th, 2008
Getting a JavaScript stracktrace in any browser
<p>Eric Wendelin has posted on getting a JavaScript stack trace no matter that the browser.With Firebug you can call console.trace() but what about the rest?
Luke Smith took Eric's work and added to it, ending up with:
-
-
(function () {
-
YOUR_NAMESPACE.getStackTrace = (function () {
-
-
var mode;
-
try {(0)()} catch (e) {
-
}
-
-
switch (mode) {
-
case 'Firefox' : return function () {
-
try {(0)()} catch (e) {
-
return e.stack.replace(/^.*?n/,'').
-
replace(/(?:n@:0)?s+$/m,'').
-
replace(/^(/gm,'{anonymous}(').
-
split("n");
-
}
-
};
-
-
case 'Opera' : return function () {
-
try {(0)()} catch (e) {
-
var lines = e.message.split("n"),
-
ANON = '{anonymous}',
-
lineRE = /Lines+(d+).*?ins+(httpS+)(?:.*?ins+functions+(S+))?/i,
-
i,j,len;
-
-
for (i=4,j=0,len=lines.length; i<len; i+=2) {
-
if (lineRE.test(lines[i])) {
-
lines[j++] = (RegExp.$3 ?
-
RegExp.$3 + '()@' + RegExp.$2 + RegExp.$1 :
-
ANON + RegExp.$2 + ':' + RegExp.$1) +
-
' -- ' + lines[i+1].replace(/^s+/,'');
-
}
-
}
-
-
lines.splice(j,lines.length-j);
-
return lines;
-
}
-
};
-
-
default : return function () {
-
var curr = arguments.callee.caller,
-
FUNC = 'function', ANON = "{anonymous}",
-
fnRE = /functions*([w-$]+)?s*(/i,
-
stack = [],j=0,
-
fn,args,i;
-
-
while (curr) {
-
fn = fnRE.test(curr.toString()) ? RegExp.$1 || ANON : ANON;
-
args = stack.slice.call(curr.arguments);
-
i = args.length;
-
-
while (i--) {
-
switch (typeof args[i]) {
-
case 'string' : args[i] = '"'+args[i].replace(/"/g,'\"')+'"'; break;
-
case 'function': args[i] = FUNC; break;
-
}
-
}
-
stack[j++] = fn + '(' + args.join() + ')';
-
curr = curr.caller;
-
}
-
return stack;
-
};
-
}
-
})();
Related Content:











http://pastie.org/254922 <– this example works.
I’ve formatted the code for read-ability.
I haven’t changed any variable names.