A Micro Toolbox

ソフトウェアのニッチな問題の対処記録です

スタックトレースを削る

スレッドダンプやログに出力されるスタックトレースはしばしば長大になる。


長大なスタックトレースを解析するとき、あまり注目しない行を削ると見通しがよくなる。

あまり注目しない行をどう判定するかが問題だが、個人的経験では、同じパッケージ内での呼び出しを省略すると3割くらい削れる。


機械的作業なので、コピペでできるようにしてみた。

https://github.com/hashimoton/cauldron


「- locked」の前は省略しないとかdoFilter()が含まれたら省略する(サーブレットフィルタを意識したもの)とか、いくつかルールを追加している。


例えばこれが

"Worker-8: reload maven project" #48 prio=5 os_prio=0 tid=0x0000000023eb4000 nid=0x2f78 runnable [0x000000002f92b000]
java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
    - locked <0x00000000d2b1a418> (a java.lang.Object)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
    - locked <0x00000000d2b38328> (a sun.security.ssl.AppInputStream)
    at okio.Okio$2.read(Okio.java:140)
    at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
    at okio.RealBufferedSource.indexOf(RealBufferedSource.java:358)
    at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:230)

こうなる。

"Worker-8: reload maven project" #48 prio=5 os_prio=0 tid=0x0000000023eb4000 nid=0x2f78 runnable [0x000000002f92b000]
java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
...
    at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
    at sun.security.ssl.InputRecord.read(InputRecord.java:503)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:973)
    - locked <0x00000000d2b1a418> (a java.lang.Object)
    at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:930)
    at sun.security.ssl.AppInputStream.read(AppInputStream.java:105)
    - locked <0x00000000d2b38328> (a sun.security.ssl.AppInputStream)
    at okio.Okio$2.read(Okio.java:140)
...


Pythonで本格的にやっているのがあった。

https://github.com/nir0s/backtrace

Javaの特定パッケージに着目するアプローチ。

https://habr.com/en/post/480268/