System.err
削除したい誤ったスタック トレースが出力されているのを見ていますが、呼び出している行を特定するのに苦労していprintStackTrace()
ます。どの回線がその呼び出しを行っているかを把握する賢い方法はありますか?
特に、呼び出しが自分のコードで行われているのか、ライブラリで行われているのか、まだわかりません。検索する場所 (自分のコードか他の人のコードか) を絞り込むだけでも役に立ちます。
編集:明確にするために、スタックトレースが出力されているをprintStackTrace()
スローした行ではなく、呼び出している行を探しています。Exception
(前者への答えは... まあ... スタック トレースです。:) スタック トレースを調べ、すべてのprintStackTrace()
ステップで可能性のある呼び出しを探すことで、明らかな場所をすべて調べましたが、何も見つかりませんでした。[a] 呼び出しがあり、私がばかである (確かに可能性があります) か、[b]Exception
が渡されて他の場所に印刷されているかのいずれかです。printStackTrace()
これが、電話を見つけるのに非常に苦労している理由です。printStackTrace()
呼び出しはthrow
、Exception
.
編集:出力を監視することSystem.err
は素晴らしい提案であり、うまく機能します。これが私が試したものです:
final PrintStream systemErr=System.err;
System.setErr(new PrintStream(new OutputStream() {
@Override
public void flush() throws IOException {
systemErr.flush();
}
@Override
public void close() throws IOException {
systemErr.close();
}
@Override
public void write(byte[] buf, int off, int len) throws IOException {
String s=new String(buf, Charset.defaultCharset());
if(s.contains("Socket closed"))
new Exception().printStackTrace();
systemErr.write(buf, off, len);
}
@Override
public void write(int b) throws IOException {
systemErr.write(b);
}
}));
ここで、私が監視していたメッセージ"Socket closed"
は、Exception
メッセージに表示された でした。write(byte[],int,int)
(a) 基礎となるコードが最終的に を介してではなくを呼び出していたことwrite(int)
、および (b) チャンクが、監視していたメッセージを異なる呼び出し間で分割しなかったことは、少し幸運でした。しかし、そうは言っても、これは魅力的でした。助けてくれてありがとう、みんな!