gpt4 book ai didi

java - 如何调试 Java 应用程序中的静默故障?

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:25 26 4
gpt4 key购买 nike

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

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

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

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

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

解决此类问题的技术是什么?

最佳答案

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

由于您在启动时使用调试参数挂起 VM,我假设您已确认调试器已正确连接。您说调试器直接跳过调用这一事实非常可疑。您能否在此应用程序中设置任何断点?这节课呢?在这个线程中呢?

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

您能否粘贴相关方法的代码片段?

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

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

关于java - 如何调试 Java 应用程序中的静默故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1037356/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com