2016-09-21 3 views
2

Я использую движок Google v8 для встраивания javascript в мое приложение. В определенные моменты я буду ссылаться на код, предоставленный пользователем, и я хочу убедиться, что он плохо ведет себя, выделяя слишком много памяти. В настоящее время, когда Javascript пытается сделать или изменить размер массива слишком велик, например, я получаю бесцеремонное сообщение:Как сказать, что экземпляр изоляции v8 использует слишком много памяти?

# 
# Fatal error in CALL_AND_RETRY_LAST 
# Allocation failed - process out of memory 
# 

И тогда весь процесс происходит сбой с SIGILL. Очевидно, это неприемлемо. Тем не менее, мне нужна возможность запуска кода, поставляемого пользователем ... и не представляется возможным вручную проверять весь код до его запуска движком.

Что бы я хотел сделать в этом случае, просто прекратите изоляцию, которая потребляет слишком много памяти (не затрагивая никаких других изолятов, которые могут работать). Есть ли способ назначить максимальный объем памяти, который может использовать программа js до ее отказа, и поэтому, если она превышает этот предел, вместо сбоя процесса вызов команд «Выполнить» или «Вызов» просто вернет ошибку или установить некоторый флаг состояния, указывающий, что он был аномально завершен.

Вещей я пытался до сих пор:

Установка пользовательского array_buffer распределителя при создании изолят, который отслеживает, сколько памяти используется и оканчивающийся изолят, когда использование памяти становится слишком высокой> The Выделяет функцию мой распределитель никогда не вызван.

Вызов AddMemoryAllocationCallback с функцией, которая отслеживает использование памяти и пытается завершить изоляцию через TerminateExecution(), когда распределения превышают определенную сумму. Эта функция вызывает вызов, но я получаю ошибку из памяти после того, как эта функция сообщила только о двух мегабайтах, хотя я знаю, что данные, создаваемые функцией плохого поведения v8, равны FAR больше, чем что.

Установка фатального обработчика ошибок через SetFatalErrorHandler и попытки вызвать TerminateExecution. Эта функция вызывает вызов, но это не мешает процессу сбой.

Есть ли что-нибудь еще, что я могу попробовать?

ответ

0

Редактировать: авторитетный ответ команды V8 - вы не можете. Но они примут патч.

v8 :: Изоляция :: SetFatalErrorHandler() должен позволить вам не сбой. Но я понимаю, что изоляция по-прежнему непригодна после этого факта. Наверное, нет способа обойти это, поскольку изолят останется в состоянии, не подлежащем восстановлению. .

http://v8.paulfryzel.com/docs/master/classv8_1_1_isolate.html#a131f1e2e6a80618ac3c8c266a041851d

(может быть, кажется, есть много вещей происходит об этом в 2013-2014 сроки, где люди в Google сказал, что нужно сделать, это просто позволить v8 убить процесс - о котором многие думали, было глупо. Я не вижу никакого разрешения)

Редактировать: Ответ на рассылку был таким, что вы не можете этого сделать. Они будут принимать патч, если он не влияет на производительность.

+0

Спасибо, хотя я просто попробовал это предложение, и, к сожалению, оно не сработало. Я обновил описание выше с тем, что я пробовал до сих пор. – markt1964

+1

Chrome - это многопроцессорный процесс, поэтому им не нужно беспокоиться о том, что javascript сбой процесса ... так как это только для одной вкладки, и в любом случае это будет недействительным. – xaxxon

+1

Ну ... это немного b! Tch ...это означает, что v8 не может быть лучшим выбором для js-движка. – markt1964