如何在Java应用程序中调试静默失败?

时间:2009-06-24 09:36:27

标签: java eclipse debugging remote-debugging

我正在尝试调试我的Java应用程序中的一个问题,该问题不会引发错误,没有异常,甚至不会使应用程序崩溃(似乎故障发生在单独的线程中)。

问题似乎在于对库函数的调用(如果重要的话,它是JAXBContext.newInstance(String))。程序将在呼叫之前到达线路,但不会在呼叫之后到达线路。我的catch块未输入,程序继续运行。

尝试向通过Struts传入的Web请求呈现XML响应时,会出现问题。已处理请求,代码应封送响应对象。客户端立即获得响应(因此代码似乎不会挂起循环),但它只是空的。

我在有问题的行之前设置了一个断点,但调试器只是在它上面运行,我不知道为什么。

我正在使用eclipse,应用程序在以-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y开头的OSGi容器(Apache Felix)中运行。在Eclipse中,然后使用“远程Java应用程序”的调试设置来连接调试器。

有什么技术可以解决这个问题?

4 个答案:

答案 0 :(得分:6)

可能是一个显而易见的问题,但你确定你抓住了Throwable吗?未经检查的异常很容易导致有问题的线程死掉(假设调用堆栈中没有人在上面捕获它。)

由于您在启动时使用调试参数挂起VM,我假设您已确认调试器正确附加。事实上,你说调试器跳过调用是非常可疑的。你能在这个应用程序中遇到任何断点吗?在这堂课怎么样?在这个帖子里怎么样?

如何在没有调试器的情况下缩小相关行? println / debugging to a file?

您可以粘贴相关方法的代码段吗?

您可以通过在问题发生之前创建第二个线程并将其连接到您认为正在死亡的线程来确认线程正在死亡的理论。然后当有问题的线程退出时,将调用第二个线程的run()方法,并且你知道它已经死了(但仍然不知道为什么。)

在回答您的一般问题时,当我在Java应用程序中出现无法在调试器中重现的错误(由于各种原因不时发生)时,我会使用sysout printlns或输出逐步修改我的代码到文件。如有必要,我也可以修改我的代码调用的代码。如果您没有要调用的代码的源代码,可以尝试使用众多BCI框架中的一个将字节代码注入到相关方法中。这是一个繁琐的过程,但偶尔只会发生。

答案 1 :(得分:2)

您可以尝试获取Thread Dump - 这将告诉您是否有任何方法阻止(例如,等待输入)。 [编辑:重新阅读你原来的问题,获得一个线程转储可能无济于事,因为看起来没有什么实际阻止。但是我把它留在这里,因为我发现它在许多其他情况下都很有用!]

如果您认为错误发生在另一个线程中,您还可以设置UncaughtExceptionHandler来尝试抓住它。

答案 2 :(得分:1)

如果您确定问题出在该方法的某个位置,您可以尝试查看JAXB source code

编辑:

好吧,如果它变得非常糟糕,你可以使用调试工具构建自己的私有副本。我希望你不必诉诸于此。

答案 3 :(得分:0)

也许在调用内部发生了无限循环,这就是为什么你不再进一步 - 但这可能不会导致崩溃(除非在每个循环中使用内存)。

相关问题