5

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

问题似乎出在对库函数的调用中(JAXBContext.newInstance(String)如果这很重要)。程序将到达调用之前的那一行,但不会到达它之后的那一行。我的catch块没有输入,程序只是继续运行。

尝试为通过 Struts 传入的 Web 请求呈现 XML 响应时会出现此问题。请求已被处理,代码应编组响应对象。客户端立即得到响应(因此代码似乎没有挂在循环中),但它只是空的。

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

我正在使用 eclipse 并且应用程序在以-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y. 然后我在 Eclipse 中使用“远程 Java 应用程序”的调试设置来连接调试器。

有什么技巧可以解决这样的问题?

4

4 回答 4

6

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

由于您使用调试参数在启动时挂起 VM,因此我假设您已确认调试器已正确附加。您说调试器跳过调用的事实非常可疑。你能在这个应用程序中打断点吗?在这堂课上呢?在这个线程中呢?

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

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

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

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

于 2009-07-16T17:48:28.930 回答
2

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

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

于 2009-06-24T09:52:56.203 回答
1

如果您确定问题出在该方法的某个地方,您可以尝试查看JAXB 源代码

编辑:

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

于 2009-06-24T09:49:07.337 回答
0

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

于 2009-06-24T09:40:38.927 回答