回答
我没有找到关于在Java中设置断点的具体参考,但在本地代码中,调试器会在原始指令上放置一个字节的中断指令(INT 3)。一旦到达,中断就会启动并对调试器进行控制。 This article有更多的信息。
从JVM Tools documentation我会推断在Java字节码中使用了类似的方法。
取决于实施。对于JITCed代码(例如常规的C/C++),有些框使用陷阱指令覆盖指令,而另一些则利用“硬件设施”(通常与存储保护相关)来检测触发断点。
类似地,在解释的字节码中,它可以是修改过的字节码(字节码代码点0xCA是为此保留的),也可以是内置于解释器中的地址比较逻辑。
point OxCA导致当前线程暂停执行一段指定的时间?这只是一个睡眠功能? – 2011-12-21 05:50:36
0xCA被保留来做任何JVM想要它做的事情。但是,如果将其修补到.class文件中,可能会将其报告为非法操作码。 – 2011-12-21 12:12:48
- 1. 字节码究竟是什么?
- 2. node.js中的节点究竟是什么?
- 3. init编码器aDecoder究竟是什么?
- 4. javascript原型的点究竟是什么
- 5. 究竟是什么'代码重复'
- 6. “文件号码”究竟是什么?
- 7. 究竟是MySQL中的“尾随空间”究竟是什么?
- 8. “句柄”究竟是什么?
- 9. getGlobalVisibleRect()究竟是什么?
- 10. Werkzeug究竟是什么?
- 11. 究竟是什么@ ViewDebug.ExportedProperty?
- 12. .parentNode究竟是什么?
- 13. Heroku究竟是什么?
- 14. session_hash究竟是什么?
- 15. 究竟是什么awakeFromNib?
- 16. 究竟是什么任务
- 17. cout/cin究竟是什么?
- 18. SKEmitterNode particleLifetime究竟是什么?
- 19. 代表究竟是什么?
- 20. 究竟是什么情景
- 21. 究竟是什么php.ini memory_limit?
- 22. 资源究竟是什么?
- 23. App Pool究竟是什么?
- 24. Erlang OTP究竟是什么?
- 25. NoSQL究竟是什么?
- 26. 雅典究竟是什么?
- 27. ContextStaticAttribute究竟是什么?
- 28. “OAuth Provider”究竟是什么?
- 29. 究竟是什么插座
- 30. targetSdkVersion究竟是什么?
我看了文章,发现它很有趣。但是我仍然无法理解所有的东西:在文章中,他们保持选定断点值的记忆值。然后,通过指向OxCA的字节码更改选定断点偏移处的值。这一点似乎只是睡觉。 因此必须考虑到代码在执行之前已经完全加载到JVM堆栈中。并改变字节码点,只会改变过程的顺序?每次改变时都不需要重新编译? – 2011-12-21 05:46:05
您不会更改您的源代码,而只会更改已编译产品的内存字节码。 JVM说字节码,对编译一无所知。 Javac是从人造Java源代码到JVM字节码的翻译器。任何调试都将在调试器的上下文中发生。调试器会告诉JVM记住被替换的代码,并将断点中断(0xCA)置于其位置。 JVM完全知道这个字节码在内存中的位置,所以替换它没有问题。 – 2011-12-21 06:15:47
你知道如何告诉JVM记住被替换的代码并把断点OxCA? – 2011-12-21 06:23:04