web-dev-qa-db-ja.com

console.trace()の結果をjavascriptの文字列としてchromeまたはfirefoxで取得する方法は?

console.trace()はコンソールに結果を出力します。
結果を文字列として取得し、ファイルに保存したい。

関数の名前を定義していません。また、callee.caller.nameで名前を取得することもできません。

86
js_

Firefoxについてはわかりませんが、v8/chromeでは、captureStackTraceと呼ばれるErrorコンストラクターのメソッドを使用できます。 ( 詳細はこちら

それを取得するためのハックな方法は次のとおりです。

var getStackTrace = function() {
  var obj = {};
  Error.captureStackTrace(obj, getStackTrace);
  return obj.stack;
};

console.log(getStackTrace());

通常、getStackTraceは、キャプチャ時にスタック上にあります。 2番目の引数は、getStackTraceをスタックトレースに含めることから除外します。

87
chjj

Error.stackは必要なものです。 ChromeおよびFirefoxで動作します。たとえば、

try { var a = {}; a.debug(); } catch(ex) {console.log(ex.stack)}

chromeで提供します:

TypeError: Object #<Object> has no method 'debug'
    at eval at <anonymous> (unknown source)
    at eval (native)
    at Object._evaluateOn (unknown source)
    at Object._evaluateAndWrap (unknown source)
    at Object.evaluate (unknown source)

firefoxの場合:

@http://www.google.com.ua/:87 _firebugInjectedEvaluate("with(_FirebugCommandLine){try { var a = {}; a.debug() } catch(ex) {console.log(ex.stack)}\n};")
@http://www.google.com.ua/:87 _firebugEvalEvent([object Event])
@http://www.google.com.ua/:67
32
Molecular Man

これにより、最新のChrome、Firefoxのスタックトレース(文字列の配列として)が得られます。OperaおよびIE10 +

function getStackTrace () {

  var stack;

  try {
    throw new Error('');
  }
  catch (error) {
    stack = error.stack || '';
  }

  stack = stack.split('\n').map(function (line) { return line.trim(); });
  return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

使用法:

console.log(getStackTrace().join('\n'));

スタックから独自の呼び出しと、ChromeおよびFirefox(ただしIE)ではない)によって使用されるタイトル「エラー」を除外します。

古いブラウザではクラッシュしませんが、空の配列を返すだけです。より普遍的なソリューションが必要な場合は、 stacktrace.js をご覧ください。サポートされているブラウザのリストは非常に印象的ですが、私が思うに、すべての依存関係を含む37Kbの縮小テキストを対象とする小さなタスクには非常に大きなものです。

16

stacktrace.js というライブラリーがあり、クロスブラウザーのスタックトレースを提供します。スクリプトを含めて、いつでも呼び出すだけで使用できます。

var trace = printStackTrace();
13
fijiaaron

これは、コンスタンティンの優れたコードに対するマイナーな拡張機能にすぎません。スローキャッチのコストを少し削減し、エラースタックをインスタンス化します。

function getStackTrace () {
    let stack = new Error().stack || '';
    stack = stack.split('\n').map(function (line) { return line.trim(); });
    return stack.splice(stack[0] == 'Error' ? 2 : 1);
}

私は通常、特定のレベルのスタックトレースが必要です(カスタムロガー用)ので、これを呼び出すときにも可能です:

getStackTrace()[2]; // get stack trace info 2 levels-deep
8
sgouros

必要なのはvar stack = new Error().stackのみです。これは、@ sgouros回答の簡略版です。

function foo() {
  bar();
}
function bar() {
  baz();
}
function baz() {
  console.log(new Error().stack);
}

foo();

おそらくすべてのブラウザで動作するとは限りません(Chromeで動作します)。

0
jcubic