2014-03-19 89 views
11

我正在使用QEMU仿真程序來跟蹤用戶程序的執行。我們添加了一個幫助功能,可以打印所有執行指令的IP。我們已經測試了這個工具的兩種變體的素數編程 - 一種用C語言編寫,另一種用Java編寫。我們爲每個程序嘗試了4個不同的輸入參數,期望在每種​​情況下執行不同數量的指令。素數編程的C版本遵循預期的線性趨勢,即線數隨着更大的輸入而增加。但是,Java程序每次都會提供完全相同數量的指令。與Java的Qemu用戶仿真

我覺得Java執行跟蹤只捕獲JVM代碼,而不是正在運行的實際代碼。

JVM修改的代碼在QEMU上運行的位置? QEMU是否有特殊的方法來捕獲自修改代碼的執行?

+0

你能說出你如何裝備QEMU嗎? (在過去,我嘗試了類似的東西,但是在我第一次嘗試只收集QEMU的每個翻譯塊的第一個IP時,並不是每個IP)。另外,如果您在本地硬件上定時執行程序,Java程序顯示預期的線性放緩? – davidg

+1

Qemu使用動態翻譯機制。它將guest塊轉換爲本地塊並將其保留在代碼緩存中。您不應該在翻譯部分添加追蹤機制。相反,生成每個指令都要調用的幫助函數。在執行每條指令期間調用一個輔助函數 –

回答

1

熱點JVM(您可能正在使用的熱點)有兩種執行java代碼的方式:解釋和編譯。當你啓動一個程序時,它將首先運行在解釋模式下。如果JVM決定經常執行一段代碼,它將編譯它並使用編譯後的代碼。

所以你應該看到執行指令數量的線性趨勢,但只要JVM運行在解釋模式下,你將只能看到解釋器的指令,因爲沒有對應於java代碼的字節碼。

您是否知道x86 CPU的性能計數器?它們可以用來衡量沒有使用任何虛擬機的指令數量。 https://perf.wiki.kernel.org/index.php/Main_Page