在没有调试器的情况下控制 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 in
或next
按钮以执行下一行或程序语句。基本上它是控制程序的执行加上它获取所有信息,如声明的变量、当前运行的函数、当前执行行等。我也想要相同的功能,但不是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 程序的执行的主要内容,如果未能解决你的问题,请参考以下文章