繁体   English   中英

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

[英]Catching an exception from another running Java application

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

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

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

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

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

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

从理论上讲,你可以筛选应用程序。 我不知道有什么特定的工具可以做到这一点,但它们可能就在那里。

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM