【问题标题】:Read stdout of console app after IDE has crashedIDE 崩溃后读取控制台应用程序的标准输出
【发布时间】:2019-01-28 15:26:02
【问题描述】:

有时 Eclipse 会死掉并让 Java 控制台程序继续运行。我想在 Eclipse 死后访问控制台输出。

我该怎么做?

我可以在任务管理器中看到控制台程序,所以它还在运行。

【问题讨论】:

标签: windows eclipse stdout


【解决方案1】:

最简单的方法可能是save the output to a file

这最适合大型日志,但也适用于您的情况。

【讨论】:

  • 问题是关于已经从 IDE 运行的进程已经死了
  • 啊,我的错。我将此问题误解为无法读取打印的内容,因为 IDE 崩溃并且窗口不再可用,不想在崩溃后继续读取新输出。
  • 原始问题包含一些重复和语言错误,因此由社区成员编辑,不确定现在是否更好,因为您陷入了误解..
【解决方案2】:

看起来我可以通过使用简单的代码编写自定义 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 小时会输出一次。稍后我会检查它。

【讨论】:

  • 似乎没有更新文件。可能有一些安全性或过度错误
  • 是的,它有效。问题是我尝试多次加载相同的代理类。由于某种原因,这不起作用。但是更改代理类名称,然后将其重新打包到 jar 中,然后再次加载可以解决问题。这不是任何安全问题
猜你喜欢
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多