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

Han*_*etz 5 java eclipse debugging remote-debugging

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

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

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

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

我正在使用eclipse,应用程序在一个OSGi容器(Apache Felix)中运行-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y.从Eclipse中,我使用"远程Java应用程序"的调试设置来连接调试器.

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

jpt*_*tme 6

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

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

在没有调试器的情况下,您是如何缩小相关行的?println /调试到文件?

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

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

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


Gro*_*hal 0

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