在没有调试器的情况下控制 java 程序的执行

Posted

技术标签:

【中文标题】在没有调试器的情况下控制 java 程序的执行【英文标题】:Controlling java program excecution without debugger 【发布时间】:2020-05-15 12:12:16 【问题描述】:

我想在没有调试器的情况下控制java程序的执行,例如下面有一个类

1. class Foo 
2.    void bar() 
3.        print("i am 3rd line of class Foo");
4.        print("i am 4th...");
5.        if(true)
6.            print("i am 6th");
7.    
8. 

我想知道 java 什么时候会执行上述任何行,直到我不告诉它继续执行它应该等我!

如果您熟悉 eclipse IDE 中的 debugger,您肯定会知道如果我们将 breakpoint 放置在 java 源代码中的某个位置, debugger 在该行暂停执行并等待直到我们点击step innext 按钮以执行下一行或程序语句。基本上它是控制程序的执行加上它获取所有信息,如声明的变量、当前运行的函数、当前执行行等。我也想要相同的功能,但不是debugger i想用我自己的java代码。你可以说我想在代码中调试java代码。

例如:如果java正在执行第3行,它应该告诉我我是(java) 将执行 第 3 行,直到我不告诉它继续它应该等待。

另一个例子

5. void bar() 
6.    // Inform me that java is going to execute line no. 7  
7.    print("Printing something...");
8.    // Again inform me that java is executing line no. 9
9.    print("bar");
10.

简而言之,我想逐行控制我的程序的执行,我不关心性能只是想实现我的目标!

我试图让这个问题尽可能简单,但如果您在理解上仍有问题(因为它有点棘手),请在下面的评论框中告诉我!

提前谢谢你;)

【问题讨论】:

Learning about JDI 可能会有所帮助。或不。它允许您编写一个充当调试器的程序:) 这很好,但我不想使用外部程序,我可以使用 Eclipse 或任何其他 ide 来代替它。基本上我想控制其中的java程序 您考虑过 JMX(Java 管理扩展)吗? @vsfDawg 如果没有外部工具它可以工作吗?我的意思是它应该在我的 java 程序中工作 【参考方案1】:

我可以想到两种方法来做到这一点,可能还有第三种。他们都是很多工作。我不会推荐其中任何一个。

    在 Java 中实现一个字节码解释器。然后实现可让您随心所欲地停止和启动的功能。

    变体:实现一个处理 Java 解析树的 Java 解释器。

    使用“字节码工程”库在加载时修改字节码,以将挂钩调用注入可用于控制执行的代码中。如果要逐行控制执行,则需要在每个方法或构造函数中的每个语句之间注入一个钩子调用。

    变体:实现您自己的自定义 Java 字节码编译器以在编译时执行相同的操作。

    使用JVMTI 实现一个Java 代理,以及一个Java 应用程序来“驱动”它。 JDI 是另一种方式,进入更高的级别。但是,这无异于实现您自己的(自定义)调试器,并且您只能使用外部应用程序来执行此操作。 (JVM 不能使用这些 API 来控制自己。)


如果您打算这样做来帮助您调试代码,我建议您只使用调试器。

如果你这样做是因为它是一个很酷的语言特性,我认为你最好设计一种新的编程语言。 (但并不是说这不是一个新想法。阅读metaprogramming。)

如果你这样做只是为了好玩......把自己搞砸了。这是你的时间。

【讨论】:

一个基于java.lang.instument的java代理就足够了,有2和3的变化。如果调试信息没有被删除,你可以在visitLineNumber in ASM上注入额外的调用。【参考方案2】:

您可以在任何您希望程序等待的地方使用System.in.read()。但是程序只会在enter 按键时继续前进。这样的事情应该可以回答您的问题:

void bar() 
    print("info message"); //info message like "I am going to do something"
    System.in.read(); //waiting for enter key press
    print("Printing something...");
    System.in.read(); //again waiting for enter key press
    print("bar");

IMO:这是一种相当粗略的调试方式(如果这是为了调试目的),因为有许多免费的 IDE 提供了很多很酷/高级的调试功能。

【讨论】:

感谢您的回答,但我想在运行时控制执行。例如,可能有一个线程“a”可以监视执行,当任何行开始执行时,它应该暂停正在运行的线程“b”,直到线程“a”恢复它!

以上是关于在没有调试器的情况下控制 java 程序的执行的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有错误消息的情况下调试 ctypes

调试和发布库及其可执行程序

01.程序的调试

如何在没有 gdbserver 的情况下使用 Eclipse CDT 进行远程调试?

程序在没有通知的情况下崩溃的原因是什么?

在调试模式下执行控制台应用程序后,如何让 Visual Studio 暂停?