スタックトレースを取得

Google Chrome 10.0.648.204で確認

方法1: Error#stackプロパティから取得 (ただし文字列形式なのでパースが必要)

スタックトレースの出力形式

例外クラス名※1: メッセージ※2
    at 例外が発生したメソッド名※3 (メソッドが呼び出されたファイル名:行番号※4:位置※5)※6
    at 例外が発生したファイル名:行番号※4:位置※5
※注釈
[1]例外クラス名  Error#nameプロパティの値
[2]メッセージ    Error#messageプロパティの値
[3](省略)        コンストラクタの場合、"new メソッド名"となる
[4]行番号        例外が発生したメソッド/コンストラクタの行番号(1〜)
[5]位置          例外が発生したメソッド/コンストラクタの最初の1文字の位置(1〜)
[6](省略)        この行はネストしているメソッドの数だけ増える (0行〜)
// スタックトレースを取得
function Hoge(){
	function Fuga(){
		throw new Error('えらー');
	}
	return new Fuga();
}

try{
	Hoge();
}catch(e){
	var raw_stacktrace = e.stack;
	var stacktrace = parse_stacktrace(raw_stacktrace);
}

// スタックトレースを出力
console.log('生のスタックトレース');
console.log(raw_stacktrace);
console.log('');

console.log('加工後のスタックトレース');
console.log(JSON.stringify(stacktrace, null, 2));
console.log('');

console.log('get_stacktrace()');
console.log(JSON.stringify(get_stacktrace(), null, 2));

/** Error#stack()のスタックトレース文字列をパース
 * @param  {string}  Error#stack()の戻り値
 * @return  {Array}  スタックトレース
 */
function parse_stacktrace(st){
	var res = [];
	
	var traces = st.split(/\r\n?|\n/).slice(1);
	for( var i=0, l=traces.length-1; i < l; ++i ){
		var m = /^\s*at\s+((?:new\s+)?[$_a-z][$\w]*)\s+\(([\s\S]+\/)([^\/]+):(\d+):(\d+)\)$/i.exec(traces[i]);
		res[i] = {
			method: m[1], 
			dir: m[2], 
			fname: m[3], 
			path: m[2]+m[3], 
			line: m[4], 
			pos: m[5]
		};
	}
	
	var m = /^\s*at\s+([\s\S]+\/)([^\/]+):(\d+):(\d+)$/.exec(traces[traces.length-1]);
	res[res.length] = {
		dir: m[1], 
		fname: m[2], 
		path: m[1]+m[2], 
		line: m[3], 
		pos: m[4]
	};
	
	return res;
}

/** スタックトレースを取得 */
function get_stacktrace(){
	var st = new Error().stack.split(/\r\n?|\n/).slice(2), 
		res = [];
	for( var i=0, l=st.length-1; i < l; ++i ){
		var m = /^\s*at\s+((?:new\s+)?[$_a-z][$\w]*)\s+\(([\s\S]+\/)([^\/]+):(\d+):(\d+)\)$/i.exec(st[i]);
		res[i] = {method: m[1], dir: m[2], fname: m[3], path: m[2]+m[3], line: m[4], pos: m[5]};
	}
	var m = /^\s*at\s+([\s\S]+\/)([^\/]+):(\d+):(\d+)$/.exec(st[st.length-1]);
	res[res.length] = {dir: m[1], fname: m[2], path: m[1]+m[2], line: m[3], pos: m[4]};
	return res;
}


実行結果 (Google Chrome 10.0.648.204で確認)

生のスタックトレース
Error: えらー
    at new Fuga (file:///C:/fakepath/get_stacktrace.js:34:9)
    at Hoge (file:///C:/fakepath/get_stacktrace.js:36:9)
    at file:///C:/fakepath/get_stacktrace.js:40:2

加工後のスタックトレース
[
  {
    "method": "new Fuga",
    "dir": "file:///C:/fakepath/",
    "fname": "get_stacktrace.js",
    "path": "file:///C:/fakepath/get_stacktrace.js",
    "line": "34",
    "pos": "9"
  },
  {
    "method": "Hoge",
    "dir": "file:///C:/fakepath/",
    "fname": "get_stacktrace.js",
    "path": "file:///C:/fakepath/get_stacktrace.js",
    "line": "36",
    "pos": "9"
  },
  {
    "dir": "file:///C:/fakepath/",
    "fname": "get_stacktrace.js",
    "path": "file:///C:/fakepath/get_stacktrace.js",
    "line": "40",
    "pos": "2"
  }
]

get_stacktrace()
[
  {
    "dir": "file:///C:/fakepath/",
    "fname": "get_stacktrace.js",
    "path": "file:///C:/fakepath/get_stacktrace.js",
    "line": "56",
    "pos": "28"
  }
]
方法2: console.trace()から取得

未調査です