2015-07-28 3 views
1

Asm.js имеет дело с большим количеством математики, и для простоты он использует ints в качестве указателей.asm.js - Получить значение указателя

Я пытаюсь отладить некоторый код, но я не вижу фактических значений, только «указатели» в asm.js.

Есть ли способ перейти прямо к стоимости?

ответ

2

Если у вас есть доступ к объекту Module, скажите в dev tools, и если у вас есть значение указателя и знаете, на какую переменную он указывает, вы можете использовать getValue. Например, для извлечения 32 разрядного целого числа в ячейке памяти 2434, вы могли бы назвать:

Module.getValue(2434, 'i32'); 

Вы можете использовать i8, i16, i32, i64, float или double для типа данных в ячейке памяти. Я не знаю, есть ли другие типы, которые вы можете пройти.

+0

Метод getValue работает, но возвращает другой адрес памяти. Поскольку JF сказал, что это поставит под угрозу безопасность кода, если вам будет сложно получить фактическое значение. –

+0

@BerianuCVlad Если getValue возвращает адрес памяти, вы можете передать это в getValue еще раз, чтобы получить значение в этом месте. –

1

Причина, по которой он использует ints, не для простоты, это для безопасности: код не должен индексироваться за пределами ArrayBuffer: куча, которую вы видите, имеет дополнительную направленность точно так же, как usepace не может видеть физическое адресов и вместо этого видит только виртуальные адреса (кроме asm.js не фрагментирует базовое хранилище).

Что вы пытаетесь сделать?

Если вы пытаетесь получить значение от отладчика, тогда что-то может быть возможно (укажите базовый адрес ArrayBuffer, используя точку останова при его построении, добавьте индекс).

Если вы хотите, чтобы значение вашего кода на C++ компилировалось в asm.js, это не сработает, потому что это может поставить под угрозу безопасность.

+0

Можете ли вы немного расширить безопасность? Можете ли вы привести конкретный пример того, что предотвратило бы альтернативу? Я на самом деле не видел безопасность в качестве причины для ArrayBuffer, и, действительно, спецификация asm.js на http://asmjs.org/spec/latest/, похоже, не упоминает о безопасности, но упоминает об эффективности и оптимизации. –

+0

Безопасность подразумевается моделью виртуальной машины JavaScript, которой должен следовать asm.js, поскольку это всего лишь подмножество JavaScript. Виртуальная машина хочет управлять всем своим адресным пространством, чтобы иметь возможность объектов GC, а также для обеспечения безопасности. Аспект безопасности в основном основан на том, что разработчики не могут хранить другие части адресного пространства процесса, например. самой ВМ, которую было бы тривиально использовать. Для ArrayBuffers это немного более тонко, поскольку виртуальная машина могла просто использовать проверку границ. В этом случае это скорее утечка информации/ASLR. –

Смежные вопросы