Можно ли увеличить размер стека в CEF / CefSharp?

Я использую cef.redist.x86.3.3497.1840 с CefSharp в проекте C#. У меня есть набор HTML-страниц, которые воспроизводят звук в формате mp3, и они отлично работают в Chrome, но когда я пытаюсь загрузить их с помощью CEF / CefSharp, визуальные эффекты в порядке, но CEF / CefSharp дает мне сообщение

"Uncaught RangeError: Maximum call stack size exceeded".

Это происходит до того, как я даже попытаюсь воспроизвести звук (который, кстати, НЕ будет воспроизводиться в этом контексте), хотя я могу загружать отдельные файлы .mp3 и воспроизводить их с помощью гизмо HTML5, предоставленного CEF.

У меня никогда не было намека на проблему с использованием этих страниц в Chrome.

Что происходит со стеком CEF / CefSharp?

Могу я как-нибудь сказать ему, чтобы он использовал больший стек?

Нужно ли мне самому перестраивать его с большим стеком?

Как 64-разрядная версия, так и сборка отладки CefSharp.MinimalExample.WinForms выдают одно и то же сообщение о переполнении стека.

Это исключение обычно возникает при бесконечной рекурсии, вероятно, из-за ошибки. Если это так, увеличение размера стека изменит только то, сколько времени потребуется, чтобы добраться туда. Он должен был быть установлен очень низким, чтобы вызвать проблемы при нормальной работе (20 или меньше).

Christopher 18.10.2018 21:33

Воспроизводится ли он с 64-битной сборкой? Вы можете использовать github.com/cefsharp/CefSharp.MinimalExample для тестирования

amaitland 18.10.2018 23:34

@Christopher: Если бы это была бесконечная рекурсия, разве это не случилось бы и в Chrome? Или, может быть, вы имели в виду ошибку в CEF, а не в моем JS?

M. Robinson 19.10.2018 04:40

@ M.Robinson: У каждого браузера есть свой код для обработки каждого формата. Каждый браузер по-разному обрабатывает незначительные повреждения / неправильные форматы. Тот факт, что он помещает некоторую часть CEF / CefSharp в бесконечную рекурсию, не означает, что он делает то же самое с Chrome. Вот почему мы используем разные браузеры для тестирования. И почему мы должны использовать разные браузеры для тестирования.

Christopher 19.10.2018 13:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
329
1

Ответы 1

Я воспроизводил как сборки x86, так и x64 со следующих веб-сайтов:
https://pass.carrefour.es/zona-cliente
https://online.bankofcyprus.com/netteller-web/
с проектом на C++ CEF. (Я думаю, что тогда это была ветка CEF 3282 - Chrome v60).

Если я правильно помню, это тоже воспроизводилось с помощью cefclient.
Проблема действительно была вызвана тем, что на странице оказался очень большой код javascript.

Я увеличил размер стека в .vcxproj:

<StackReserveSize>0x00120000</StackReserveSize>

(поэтому добавьте дополнительно 128 КБ к 1 МБ по умолчанию).

В NodeJS есть параметр --v8 с именем --stack_size, который звучит похоже, но я не знаю, есть ли что-то подобное в CEF (по крайней мере, я не помню, чтобы это было открыто).

В то время я прокомментировал это исправление:

Increase stack size from the default 1MB adding 128 KB more. 
This seems to be necessary for renderer's V8, which is trashing 
the page guard instead of raising JS RangeError or stack overflow, 
but blows up with STATUS_GUARD_PAGE_VIOLATION or STATUS_STACK_OVERFLOW *and* 
overwriting the first frame. 

The debugger itself is defeated since there is no context to determine which 
10000+ lines JS blows up the parser.

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

Для удобства вот сообщения об ошибках (отредактировано):

[*edited*] webpage crashes if you access https://pass.carrefour.es/zona-cliente
We have internal repro 100%.

а также

If you access the webpage https://online.bankofcyprus.com/netteller-web/ in [*edited*], the tab crashes unexpectedly:

"The webpage has quit unexpectedly. The problem may have been caused by an exception, or another exceptional condition such as blocking scripts or requests generated by the webpage.
Please Reload page or go Back to the previous page."
We have internal repro. Full dump can be found here: *edited*

Проблемы, которые могут быть связаны: V8
https://bugs.chromium.org/p/v8/issues/detail?id=8234
https://bugs.chromium.org/p/v8/issues/detail?id=8053
https://bugs.chromium.org/p/v8/issues/detail?id=6617
https://bugs.chromium.org/p/v8/issues/detail?id=6438

Хром:
https://bugs.chromium.org/p/chromium/issues/detail?id=753705

Другие вопросы по теме