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


98

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

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


1
これはPhantomJSでは機能しません:(
ekkis

回答:


103

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

したがって、それを取得するハックな方法は次のようになります。

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

console.log(getStackTrace());

通常は、getStackTraceキャプチャされたときにスタック上にあります。そこでの2番目の引数getStackTraceは、スタックトレースに含まれないようにします。


18
情報をくれてありがとう。これはChromeでは機能しましたが、Firefoxでは機能しませんでした。だから私はもう一度検索して見つけたError().stack。Firefoxではオブジェクト名と関数名が失われ、Chromeではオブジェクト名が失われますが(と同じError.captureStackTrace)、Error().stack両方のブラウザーで機能し、デバッグに十分な情報が得られます。
js_ 2011

@Konstantin Smolyaninの回答とまったく同じ結果。結果として同じ制限付きの詳細。
Codebeat

これは受け入れられる答えではありません。ここで取得するスタックは、「上部」のみを含む「切り捨て」ですが、console.trace()は完全なスタックを表示します。ここでスタックの深さ30との例を参照してください:stackoverflow.com/questions/62768598/...
mathheadinclouds

34

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

2
ご回答有難うございます。ただし、これは例外が発生したときにのみ機能します。例外なくスタックトレースを取得する必要があります。
js_ 2011

8
何について(new Error).stack
JasonSmith

これはa.debug()で例外をスローするはずです-スタックを取得するにはコストのかかる方法ですが、機能するはずです。
フィジーアロン

このアプローチは、何らかの理由でPhantomJSなどでのみ実行できるコードからトレースを取得するときにも役立ちます。
ワックススピン2014

18

これにより、最新の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の縮小テキスト。


12

ブラウザ間のスタックトレースを提供する、stacktrace.jsというライブラリがあります。スクリプトを組み込んで、いつでも呼び出すだけで使用できます。

var trace = printStackTrace();

ES6のプロミスをサポートするように実装が変更されたので、github.com / stacktracejs / stacktrace.jsを確認します。
Erez Cohen

今のところこれを使用する必要があることに注意してください:github.com/stacktracejs/stacktrace.js/tree/stable?files=1(新しいバージョンはまだリリースされていません)
Erez Cohen

9

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

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

5

あなただけが必要var stack = new Error().stackです。これは、@ sgouros回答の簡易版です。

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

foo();

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.