Я использую 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 выдают одно и то же сообщение о переполнении стека.
Воспроизводится ли он с 64-битной сборкой? Вы можете использовать github.com/cefsharp/CefSharp.MinimalExample для тестирования
@Christopher: Если бы это была бесконечная рекурсия, разве это не случилось бы и в Chrome? Или, может быть, вы имели в виду ошибку в CEF, а не в моем JS?
@ M.Robinson: У каждого браузера есть свой код для обработки каждого формата. Каждый браузер по-разному обрабатывает незначительные повреждения / неправильные форматы. Тот факт, что он помещает некоторую часть CEF / CefSharp в бесконечную рекурсию, не означает, что он делает то же самое с Chrome. Вот почему мы используем разные браузеры для тестирования. И почему мы должны использовать разные браузеры для тестирования.





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