【问题标题】:Tracking "hidden" exceptions跟踪“隐藏”异常
【发布时间】:2011-05-30 16:36:46
【问题描述】:

我正在检查我的一个程序的输出,我不时看到类似“java.lang.NullPointerException”这样的消息,没有别的。因为这不是来自我的代码,所以我很确定,有一些 3rd 方库,其中一些混蛋做了类似的事情:catch ( ex ) { println ex.getMessage () }。

有没有办法重新启用堆栈跟踪报告并查看问题发生在哪里?通过调试器+逐步执行来做到这一点并不容易,因为问题是随机发生的,当我在大量输入数据上运行程序时,如果我尝试重新运行则无法重现它看起来有罪的数据切片。

提前致谢!

【问题讨论】:

    标签: java debugging exception


    【解决方案1】:

    更新:您最好使用您发现的 IDE 异常断点。

    否则,您可以通过System.setOut(..) 设置自定义PrintStream,然后在打印某些内容时,还打印Thread.currentThread().getStackTrace()

    理想情况下,您的PrintStream 应该只包装原始System.out 并发送给它。比如:

    public class PrintStreamWrapper extends PrintStream {
        public PrintStreamWrapper(OutputStream out) {
           super(out);
        }
    
        public void println(String x) {
             StackTraceElement[] trace = Thread.currentThread().getStackTrace();
             // print everything, but not to the System.out, 
             // because you'll end up in a loop.
             super.println(x);
        }   
    }
    

    然后,在程序的开头:

    System.setOut(new PrintStreamWrapper(System.out));
    

    【讨论】:

    • 哇!非常感谢!作为另一种选择,我刚刚发现 Eclipse 能够在抛出异常时中断执行:agile.csc.ncsu.edu/SEMaterials/tutorials/eclipse-debugger/…
    • @user529286 是的,这也是一个选项。也许是一个更好的。
    • @Bozho :严格来说,包装类应该使用组合而不是继承,对吗?
    【解决方案2】:

    不看代码,很难说。如果频繁抛出异常,HotSpot 编译器实际上可能会优化周围的代码,以至于 VM 无法生成正确的堆栈跟踪,而 Exception#printStackTrace() 只会打印异常的类名和消息。

    在做任何其他事情之前,我会尝试使用 -XX:-OmitStackTraceInFastThrow VM 参数运行您的应用程序,以强制 VM 为所有异常创建适当的堆栈跟踪。

    【讨论】:

    • 谢谢 jambjo,在我看来就是这样!
    猜你喜欢
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-27
    • 2013-09-13
    相关资源
    最近更新 更多