【发布时间】:2019-01-28 15:26:02
【问题描述】:
有时 Eclipse 会死掉并让 Java 控制台程序继续运行。我想在 Eclipse 死后访问控制台输出。
我该怎么做?
我可以在任务管理器中看到控制台程序,所以它还在运行。
【问题讨论】:
-
看着stackoverflow.com/questions/43157989/… 我可以通过Java API 连接到这个JVM!哇!但是接下来呢???
有时 Eclipse 会死掉并让 Java 控制台程序继续运行。我想在 Eclipse 死后访问控制台输出。
我该怎么做?
我可以在任务管理器中看到控制台程序,所以它还在运行。
【问题讨论】:
最简单的方法可能是save the output to a file。
这最适合大型日志,但也适用于您的情况。
【讨论】:
看起来我可以通过使用简单的代码编写自定义 Agent.jar 来做到这一点
import java.io.File;
import java.io.PrintStream;
import java.lang.instrument.Instrumentation;
public class Agent {
public static void premain(String args, Instrumentation instrumentation) {
}
public static void agentmain(String agentArgs) {
try {
PrintStream psout =new PrintStream(new File("C:\\LOG\\out.txt"));
PrintStream pserr =new PrintStream(new File("C:\\LOG\\err.txt"));
System.setOut(psout);
System.setErr(pserr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
带有预先创建的文件。 我在 MANIFEST.MF 中将其作为带有 Agent-Class 字符串的 jar 然后“注入”到正在运行的虚拟机中,就像
public class TestAttachJVM {
public static void main(String s[]) throws Exception {
VirtualMachine vm = VirtualMachine.attach("<PID>");
try {
// load agent into target VM
String agent = "c:\\DIR\\agent.jar";
vm.loadAgent(agent);
} finally {
// detach
vm.detach();
}
}
}
然后我执行完这个简单的程序,out.txt 和 err.txt 被锁定。 不幸的是,我无法立即看到输出,因为我尝试挂钩的程序每 1-4 小时会输出一次。稍后我会检查它。
【讨论】: