从另一个正在运行的Java应用程序中捕获异常

时间:2011-09-16 14:27:01

标签: java exception

我遇到的问题是我有一个程序(不是我写的,是别人写的)我想全天候运行,但有时会崩溃。通常情况下,这不是问题,因为我可以简单地创建一个进程监视器来检查它是否崩溃,然后在必要时重新启动它。

但是,这个特殊程序有时会抛出异常并将其输出到集成到其中的图形界面中。在这种情况下,程序根本不会崩溃。界面保持不变,但实际的服务器功能不可用。

有什么方法可以从这个过程中拦截这些信息吗?

5 个答案:

答案 0 :(得分:4)

您想使用Java Virtual Machine Tools Interface。我不能给你代码来捕捉你的异常,但这是在哪里看。你将不得不做一些侦探工作来找到抛出异常的类,或者至少找到一些指示它已被抛出。

编辑:您也可以尝试致电供应商,了解他们是否知道某种方式。您还可以查看是否将异常写入日志文件,然后您可以查看该文件。

答案 1 :(得分:2)

我假设您无法访问源代码,因此如果它输出到GUI,则答案为否。即使您可以附加到正在运行的进程,您也需要拦截异常,但它会被捕获并发送到GUI,而不是从应用程序抛出。

理论上,你可以屏幕刮掉应用程序。我不知道有任何具体的工具可以做到这一点,但它们可能就在那里。

编辑:上面我可能错了,查看帖子here,他们从正在运行的帖子中获取堆栈。你可能无法以这种方式捕获异常,但是如果你很幸运,当程序正常运行时,与抛出异常相比,堆栈跟踪看起来会非常不同。

编辑2:我提交了第二个更准确的答案。见下文。

答案 2 :(得分:2)

这可能有效,也可能无效,但是如果应用程序显示错误并且服务器停止工作,内存使用量会下降吗?如果是这样,你可能只需要向进程监视器添加一些逻辑来调用windows命令tasklist以查看内存使用率是否低于某个阈值。您必须检查程序通常使用多少内存以及错误后它使用了多少内存。

由于你说服务器功能停止工作,另一种选择可能是编写一个简单的程序,基本上只是ping服务器,你想要确保它仍然正常。如果没有,请终止该进程并重新启动它。

答案 3 :(得分:1)

其他程序是Java吗?看看AspectJ,如果你对程序启动有控制权,你可以使用它来破解。

答案 4 :(得分:1)

如果没有重建应用程序的能力,除非你做一些广泛的黑客攻击,否则你通常会运气不好。这是我能想到的一个选择。

应用程序很可能用自己的流实现替换System.out和/或System.err。如果是这种情况,您可以尝试找到此流的类,并将其替换为您自己的同名包装器。您可以使用jarjar重命名原始类。在wapper中,您可以提供控制台输出以检测异常。