2011-12-21 157 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