Bagaimana cara meningkatkan jumlah baris yang ditampilkan dari dump pelacakan tumpukan Java?

Jawaban:

122

Anda tidak perlu; informasi tersebut ada di tempat lain di pelacakan tumpukan. Dari dokumen printStackTrace():

Perhatikan keberadaan garis yang berisi karakter "...". Baris ini menunjukkan bahwa sisa pelacakan tumpukan untuk pengecualian ini cocok dengan jumlah bingkai yang ditunjukkan dari bagian bawah jejak tumpukan pengecualian yang disebabkan oleh pengecualian ini (pengecualian "melampirkan").

Singkatan ini dapat sangat mengurangi panjang keluaran dalam kasus umum di mana pengecualian terbungkus dilemparkan dari metode yang sama saat "pengecualian kausatif" ditangkap.

Dengan kata lain, "... x more"hanya muncul di pengecualian berantai, dan hanya jika xbaris terakhir dari jejak tumpukan sudah ada sebagai bagian dari jejak tumpukan pengecualian berantai lainnya.

Misalkan suatu metode menangkap pengecualian Foo, membungkusnya dalam Bilah pengecualian, dan melempar Bilah. Kemudian jejak tumpukan Foo akan dipersingkat. Jika Anda karena alasan tertentu menginginkan jejak lengkap, yang perlu Anda lakukan adalah mengambil baris terakhir sebelum ...jejak tumpukan di Foo dan mencarinya di jejak tumpukan Bar; segala sesuatu di bawah garis itu persis seperti yang akan dicetak dalam jejak tumpukan Foo.

Michael Myers
sumber
Paragraf terakhir menyesatkan. Tidak akan ada tumpang tindih, garis sebelumnya ...adalah bingkai pertama yang berbeda. Namun setidaknya akan berada di kelas yang sama yang membantu menemukannya.
Marcono1234
5

Tebakan cepat pada metode untuk Anda.

static void printLongerTrace(Throwable t){
    for(StackTraceElement e: t.getStackTrace())
        System.out.println(e);
}
jjnguy
sumber
2

Mari kita ambil jejak tumpukan dari dokumentasi Throwable.printStackTrace () :

HighLevelException: MidLevelException: LowLevelException
    at Junk.a(Junk.java:13)
    at Junk.main(Junk.java:4)
Caused by: MidLevelException: LowLevelException
    at Junk.c(Junk.java:23)
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    ... 1 more
Caused by: LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    ... 3 more

Penyebabnya ditampilkan dari yang paling bertingkat di bagian bawah ("akar masalah"), ke jejak tumpukan yang dicetak.

Dalam hal ini akar penyebabnya adalah LowLevelException, yang disebabkan MidLevelException, yang disebabkan HighLevelException.

Untuk mendapatkan pelacakan tumpukan lengkap Anda harus melihat bingkai dari pengecualian yang melampirkan (dan pengecualian yang melampirkan):

  1. Lihat berapa banyak frame yang dihilangkan: "... X lebih"
  2. Cari bingkai yang dihilangkan di pengecualian yang melampirkan
    1. Lihat berapa banyak frame yang dihilangkan: "... Y lagi"
    2. Tambahkan bingkai X - Y pertama ke pelacakan tumpukan
  3. Jika Y> 0, ulangi langkah 2 dengan itu sebagai jumlah frame yang dihilangkan

Jadi jika kami ingin mendapatkan jejak tumpukan lengkap LowLevelExceptionkami akan melakukan hal berikut:

  1. Lihat berapa banyak bingkai yang dihilangkan: "... 3 lagi"
  2. Cari bingkai yang dihilangkan di pengecualian yang melampirkan ( MidLevelException)
    1. 1 bingkai telah dihilangkan ("... 1 lagi")
    2. Tambahkan 2 (3 - 1) bingkai pertama ke jejak tumpukan
  3. Ulangi langkah 2 dengan 1 sebagai jumlah frame yang dihilangkan
    1. Lihat pengecualian terlampir dari MidLevelException(HighLevelException )
    2. Tambahkan 1 bingkai pertama ke jejak tumpukan

Jejak tumpukan lengkap Anda akan terlihat seperti ini:

LowLevelException
    at Junk.e(Junk.java:30)
    at Junk.d(Junk.java:27)
    at Junk.c(Junk.java:21)
    // From MidLevelException stack trace
    at Junk.b(Junk.java:17)
    at Junk.a(Junk.java:11)
    // From HighLevelException stack trace
    at Junk.main(Junk.java:4)

Catatan samping:

  • Mungkin ada kasus di mana tidak ada bingkai yang terdaftar, misalnya:

    HighLevelException: MidLevelException
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        ... 1 more

    Hal ini dapat terjadi jika penyebabnya itu dibuat di baris yang sama: new HighLevelException(new MidLevelException()). Jangan bingung dengan ini, pendekatan yang dijelaskan di atas masih berfungsi, hanya tidak ada bingkai untuk digunakan dari pengecualian, lanjutkan dengan yang melampirkan.

  • Dalam beberapa kasus, Anda dapat menghemat penghitungan dengan melihat bingkai pertama yang tidak dihilangkan (baris di atas ... X more). Jika Anda mengetahui metode mana yang memanggil metode di baris itu, Anda dapat langsung mencari pemanggil dalam bingkai pengecualian yang melampirkan:

    HighLevelException: MidLevelException: LowLevelException
        at Junk.c(Junk.java:29)
        at Junk.b(Junk.java:21)
        at Junk.a(Junk.java:13)
        at Junk.main(Junk.java:4)
    Caused by: MidLevelException
        // You know Junk.d is only called by Junk.b
        at Junk.d(Junk.java:35)
        ... 3 more
Marcono 1234
sumber