回答
我沒有找到關於在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