我看到一个错误的堆栈跟踪被打印到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
消息中。我有点幸运的是(a)底层代码最终是通过write(byte[],int,int)
而不是调用write(int)
,并且(b)块没有将我正在监视的消息拆分为不同的调用。然而,话虽如此,这很有魅力。谢谢大家的帮助!