2011-12-21 195 views

回答

3

我没有找到关于在Java中设置断点的具体参考,但在本地代码中,调试器会在原始指令上放置一个字节的中断指令(INT 3)。一旦到达,中断就会启动并对调试器进行控制。 This article有更多的信息。

JVM Tools documentation我会推断在Java字节码中使用了类似的方法。

+0

我看了文章,发现它很有趣。但是我仍然无法理解所有的东西:在文章中,他们保持选定断点值的记忆值。然后,通过指向OxCA的字节码更改选定断点偏移处的值。这一点似乎只是睡觉。 因此必须考虑到代码在执行之前已经完全加载到JVM堆栈中。并改变字节码点,只会改变过程的顺序?每次改变时都不需要重新编译? – 2011-12-21 05:46:05

+0

您不会更改您的源代码,而只会更改已编译产品的内存字节码。 JVM说字节码,对编译一无所知。 Javac是从人造Java源代码到JVM字节码的翻译器。任何调试都将在调试器的上下文中发生。调试器会告诉JVM记住被替换的代码,并将断点中断(0xCA)置于其位置。 JVM完全知道这个字节码在内存中的位置,所以替换它没有问题。 – 2011-12-21 06:15:47

+0

你知道如何告诉JVM记住被替换的代码并把断点OxCA? – 2011-12-21 06:23:04

1

取决于实施。对于JITCed代码(例如常规的C/C++),有些框使用陷阱指令覆盖指令,而另一些则利用“硬件设施”(通常与存储保护相关)来检测触发断点。

类似地,在解释的字节码中,它可以是修改过的字节码(字节码代码点0xCA是为此保留的),也可以是内置于解释器中的地址比较逻辑。

+0

point OxCA导致当前线程暂停执行一段指定的时间?这只是一个睡眠功能? – 2011-12-21 05:50:36

+0

0xCA被保留来做任何JVM想要它做的事情。但是,如果将其修补到.class文件中,可能会将其报告为非法操作码。 – 2011-12-21 12:12:48