Bagaimana cara mendapatkan hasil console.trace () sebagai string di javascript dengan chrome atau firefox?

98

console.trace()mengeluarkan hasilnya di konsol.
Saya ingin mendapatkan hasil sebagai string dan menyimpannya ke file.

Saya tidak menentukan nama untuk fungsi dan saya juga tidak bisa mendapatkan namanya callee.caller.name.

js_
sumber
1
ini tidak berfungsi di PhantomJS :(
ekkis

Jawaban:

103

Saya tidak yakin tentang firefox, tetapi di v8 / chrome Anda dapat menggunakan metode pada konstruktor Kesalahan yang disebut captureStackTrace. ( Info selengkapnya di sini )

Jadi cara hacky untuk mendapatkannya adalah:

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

console.log(getStackTrace());

Biasanya, getStackTraceakan ada di tumpukan saat ditangkap. Argumen kedua di sana tidak getStackTracedisertakan dalam pelacakan tumpukan.

chjj
sumber
18
Terima kasih atas informasi Anda. Itu bekerja di chrome tetapi tidak di firefox. Jadi saya mencari lagi dan menemukan Error().stack. Meskipun nama Objek dan fungsi hilang di firefox dan nama objek hilang di chrome (sama seperti Error.captureStackTrace), Error().stackberfungsi di kedua browser dan memberi saya informasi yang cukup untuk men-debug.
js_
Hasil yang sama persis dengan jawaban dari @Konstantin Smolyanin. Detail terbatas yang sama sebagai hasilnya.
Codebeat
Ini seharusnya bukan jawaban yang diterima. Tumpukan yang Anda dapatkan di sini adalah "dipotong" yang hanya berisi "bagian atas", sedangkan console.trace () akan menampilkan tumpukan penuh. Lihat contoh dengan kedalaman tumpukan 30 di sini: stackoverflow.com/questions/62768598/…
mathheadinclouds
34

Error.stack adalah yang Anda butuhkan. Ini berfungsi di Chrome dan Firefox. Sebagai contoh

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

akan memberikan di 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)

dan di 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
Manusia Molekuler
sumber
2
Terima kasih atas jawaban anda. Tapi itu hanya berfungsi jika pengecualian terjadi. Saya perlu mendapatkan pelacakan tumpukan tanpa kecuali.
js_
8
Bagaimana dengan(new Error).stack
JasonSmith
Ini harus memunculkan pengecualian pada a.debug () - ini cara yang mahal untuk mendapatkan tumpukan, tetapi seharusnya berfungsi.
fijiaaron
Pendekatan ini juga berguna saat mencoba mendapatkan jejak dari beberapa kode yang hanya dapat dijalankan, misalnya PhantomJS atau sejenisnya untuk alasan apa pun.
waxspin
18

Ini akan memberikan jejak tumpukan (sebagai array string) untuk Chrome modern, Firefox, Opera dan 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);
}

Pemakaian:

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

Ini mengecualikan dari tumpukan panggilannya sendiri serta judul "Kesalahan" yang digunakan oleh Chrome dan Firefox (tetapi bukan IE).

Seharusnya tidak macet di browser lama tetapi hanya mengembalikan array kosong. Jika Anda membutuhkan solusi yang lebih universal, lihat stacktrace.js . Daftar browser yang didukungnya benar-benar mengesankan tetapi menurut saya ini sangat besar untuk tugas kecil yang dimaksudkan untuk: 37Kb teks yang diperkecil termasuk semua dependensi.

Konstantin Smolyanin
sumber
12

Ada pustaka bernama stacktrace.js yang memberi Anda pelacakan tumpukan lintas browser. Anda dapat menggunakannya hanya dengan memasukkan skrip dan memanggil kapan saja:

var trace = printStackTrace();
fijiaaron
sumber
Saya akan melihat github.com/stacktracejs/stacktrace.js karena implementasinya telah berubah untuk mendukung janji ES6.
Erez Cohen
Perhatikan bahwa untuk saat ini ini harus digunakan: github.com/stacktracejs/stacktrace.js/tree/stable?files=1 (versi baru belum dirilis)
Erez Cohen
9

Ini hanya peningkatan kecil pada kode Konstantin yang sangat baik. Ini memotong sedikit biaya melempar-menangkap dan hanya membuat contoh tumpukan Kesalahan:

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);
}

Saya biasanya menginginkan tingkat pelacakan tumpukan tertentu (untuk logger khusus saya) jadi ini juga dapat dilakukan saat memanggil:

getStackTrace()[2]; // get stack trace info 2 levels-deep
sgouros.dll
sumber
5

kamu hanya butuh var stack = new Error().stack. ini adalah versi sederhana dari jawaban @sgouros.

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

foo();

Mungkin tidak akan berfungsi di setiap browser (berfungsi di Chrome).

jcubic
sumber