2015-07-28 79 views
1

Asm.js處理大量數學,爲了簡單起見,它使用int作爲指針。asm.js - 獲取指針的值

我想調試一些代碼,但我看不到實際值,只有asm.js中的'指針'。

有沒有什麼辦法可以直接找到價值?

回答

2

如果您有權訪問Module對象,請在開發工具中說明,如果您有指針值並知道它指向的變量類型,則可以使用getValue。例如,檢索存儲器位置2434一個32位整數,你會打電話:

Module.getValue(2434, 'i32'); 

您可以使用i8i16i32i64floatdouble用於數據的存儲位置的類型。我不知道是否還有其他類型可以通過。

+0

getValue方法有效,但返回另一個內存地址。正如JF所說,如果你想獲得實際價值,它會危害代碼的安全性。 –

+0

@BerianuCVlad如果getValue返回一個內存地址,您可以再次將它傳遞給getValue以獲取該位置的值。 –

1

它使用整數的原因並不是爲了簡單起見,它是爲了安全:代碼不應該能夠在ArrayBuffer之外進行索引:您看到的堆有一個額外的間接方向,與使用空間不能看到物理方法完全相同地址,而只能看到虛擬地址(除了asm.js不會分割底層存儲)。

你想做什麼?

如果試圖從調試器獲取值,那麼可能會有某些可能(通過在其構造上使用斷點,添加索引來計算ArrayBuffer的基地址)。

如果你想從編譯爲asm.js的C++代碼中獲取值,那麼這將不起作用,因爲它會危及安全性。

+0

你可以擴大一點安全嗎?你能給出一個阻止替代方案允許的具體例子嗎?實際上我並沒有將安全性視爲ArrayBuffer的原因,實際上http://asmjs.org/spec/latest/中的asm.js規範似乎沒有提到安全性,但提到了效率和優化。 –

+0

JavaScript虛擬機的模型隱含了安全性,asm.js必須遵守,因爲它只是JavaScript的一個子集。虛擬機希望控制其整個地址空間以便能夠GC對象以及安全。安全性方面主要基於不允許開發者存儲到進程地址空間的其他部分,例如,虛擬機本身,這是微不足道的利用。對於ArrayBuffers來說,它稍微微妙一點,因爲虛擬機可以使用邊界檢查。這是更多的信息/ ASLR泄漏。 –