Проблемы с запуском внешних модулей (Chromium) — различия между версиями
Admin (обсуждение | вклад) |
Admin (обсуждение | вклад) |
||
| (не показана одна промежуточная версия этого же участника) | |||
| Строка 10: | Строка 10: | ||
Наиболее простым способом убедиться в том, что полнота файлов и соответствие версий соблюдены станет удаление клиента oktell с последующей переустановкой. При этом следует также удалить весь каталог клиента, который, как правило, расположен по пути C:\Program Files (x86)\Oktell\Client | Наиболее простым способом убедиться в том, что полнота файлов и соответствие версий соблюдены станет удаление клиента oktell с последующей переустановкой. При этом следует также удалить весь каталог клиента, который, как правило, расположен по пути C:\Program Files (x86)\Oktell\Client | ||
| − | + | Данный список проблем не полон, он представляет собой наиболее распространенные случаи. Ниже пойдет более подробное описание возможных ситуаций. Оно предназначено для специалистов и позволяет углубиться в понимании происходящих процессов. | |
== Суть "зомби-состояния". == | == Суть "зомби-состояния". == | ||
| Строка 23: | Строка 23: | ||
Все причины неудачной инициализации Cef можно условно разделить на 3 группы: файлы, кэш, антивирус. <br> | Все причины неудачной инициализации Cef можно условно разделить на 3 группы: файлы, кэш, антивирус. <br> | ||
Постоянное появление упомянутого вплывающего сообщения говорит о необходимости исправления "окружения процесса" (файлы, кэш, антивирус). | Постоянное появление упомянутого вплывающего сообщения говорит о необходимости исправления "окружения процесса" (файлы, кэш, антивирус). | ||
| + | |||
| + | |||
| + | 1. ОГРАНИЧЕНИЯ CEF / CefSharp | ||
| + | |||
| + | 1. Cef.Initialize вызывается повторно в том же процессе | ||
| + | После первой попытки (успешной или нет) Chromium не даёт второй полноценный init. | ||
| + | Типичное сообщение: «can only be called once per process», | ||
| + | при этом Cef.IsInitialized может остаться false. | ||
| + | |||
| + | 2. Первый Cef.Initialize завершился с ошибкой или вернул false | ||
| + | Нативный слой CEF считает init «использованным», повтор в этом процессе недоступен. | ||
| + | |||
| + | 3. ChromiumWebBrowser создан до успешного явного Cef.Initialize | ||
| + | CefSharp может запустить скрытую инициализацию при создании первого экземпляра; | ||
| + | последующий вызов Cef.Initialize в EnsureInitialized даёт «only once». | ||
| + | |||
| + | 4. Попытка Cef.Shutdown() и повторного Initialize в том же процессе | ||
| + | Официально не поддерживается, часто приводит к падению или нерабочему состоянию. | ||
| + | |||
| + | 5. Cef.Initialize / Cef.Shutdown вызваны не из UI-потока | ||
| + | Риск зависания и некорректного состояния CEF. | ||
| + | |||
| + | 6. Cef.Initialize и Cef.Shutdown вызваны из разных потоков | ||
| + | Нарушение требований CefSharp к потоку init/shutdown. | ||
| + | |||
| + | 2. ГОНКИ И ПОРЯДОК ВЫЗОВОВ В КОДЕ | ||
| + | |||
| + | 7. Гонка потоков при вызове EnsureInitialized без блокировки | ||
| + | Два потока одновременно вызывают Cef.Initialize (до добавления InitLock). | ||
| + | |||
| + | 8. Игнорируется false из EnsureInitialized | ||
| + | После сбоя init всё равно создаётся ChromiumWebBrowser — | ||
| + | вторая ошибка «Cef.IsInitialized was false». | ||
| + | |||
| + | 9. Ранняя инициализация в MainForm.InitializeComponent при ClientStatic.User == null | ||
| + | Первая (и единственная) попытка init с общим кэшем %AppData%\CEF до логина; | ||
| + | при сбое процесс «сгорает» до открытия браузера. | ||
| + | |||
| + | 10. Разные cacheSubfolder в разных местах | ||
| + | (MainForm/WebFormCtrl — логин, BackBrowserControlCef/BrowserPageCef — null) | ||
| + | Не «only once», но повышает риск конфликтов profile и непредсказуемого первого init. | ||
| + | |||
| + | 11. Несколько точек вызова EnsureInitialized | ||
| + | (MainForm, BackBrowser, BrowserPage, WebFormCtrl) | ||
| + | При ошибке на раннем вызове все последующие попадают в «зомби». | ||
| + | |||
| + | 3. ФАЙЛЫ, ПУТИ, ОКРУЖЕНИЕ | ||
| + | |||
| + | 12. Отсутствует oktell.ClientStarter4.exe в каталоге запуска клиента | ||
| + | TryResolveBrowserSubprocessPath возвращает false, init не выполняется. | ||
| + | |||
| + | 13. Неверный или неабсолютный путь к subprocess, кэшу, locales, log-файлу | ||
| + | Для CefSharp 133+ требуются абсолютные пути. | ||
| + | |||
| + | 14. Отсутствует каталог locales или некорректный LocalesDirPath | ||
| + | Сбой или деградация при init. | ||
| + | |||
| + | 15. Нет прав на запись в %AppData%\CEF, LOG\Cef, каталог кэша или рабочий каталог | ||
| + | init возвращает false или падает. | ||
| + | |||
| + | 16. Повреждённый или частично записанный каталог кэша %AppData%\CEF | ||
| + | Блокировки, ошибки profile, Initialize returned false. | ||
| + | |||
| + | 17. Антивирус / DLP / политики Windows блокируют запуск subprocess CEF или запись в кэш | ||
| + | |||
| + | 18. Отсутствуют или несовместимы native-библиотеки CEF | ||
| + | (версия CefSharp vs разрядность процесса x86/x64, неполная установка) | ||
| + | |||
| + | 4. ГОНКИ ПРОЦЕССОВ И КЭШ | ||
| + | |||
| + | 19. Второй экземпляр клиента с тем же RootCachePath | ||
| + | С CefSharp 120+ Chromium process singleton: второй процесс не может нормально | ||
| + | инициализировать тот же profile. | ||
| + | |||
| + | 20. Зависший предыдущий процесс oktell / subprocess CEF держит lock на каталоге кэша | ||
| + | init текущего процесса падает. | ||
| + | |||
| + | 21. SkipMutex=1 или разные TerminalAddress | ||
| + | Несколько экземпляров клиента одновременно, конкуренция за %AppData%\CEF. | ||
| + | |||
| + | 22. Subprocess CEF (renderer, GPU и т.д.) не завершился после краша родителя | ||
| + | Блокировка файлов profile до перезагрузки или ручного завершения процессов. | ||
| + | |||
| + | 5. КОНФИГУРАЦИЯ ПРИЛОЖЕНИЯ | ||
| + | |||
| + | 23. Некорректные CefCommandLineArguments в конфиге | ||
| + | Неверные флаги командной строки Chromium. | ||
| + | |||
| + | 24. Конфликтующие аргументы DPI / масштабирования (CefDpiUnawareScaleDefaults) | ||
| + | Проблемы init на части систем. | ||
| + | |||
| + | 25. Неверный Cef_LogSeverity или недоступный путь к log-файлу | ||
| + | Косвенный сбой при создании settings (реже). | ||
| + | |||
| + | 6. СОСТОЯНИЕ ПРИЛОЖЕНИЯ В МОМЕНТ INIT | ||
| + | |||
| + | 26. Init вызван до готовности окружения | ||
| + | (нет User, неверный StartupDirectory, клиент запущен не из каталога установки) | ||
| + | |||
| + | 27. Init в процессе, где уже были другие попытки работы с CefSharp | ||
| + | (повторная загрузка домена, тестовый код, плагин) — | ||
| + | единственная попытка init уже израсходована. | ||
| + | |||
| + | 28. Недостаток памяти / ресурсов при старте subprocess CEF | ||
| + | init возвращает false, процесс остаётся неинициализированным и «заблокированным» для retry. | ||
| + | |||
| + | |||
| + | Справка CefSharp | ||
| + | https://github.com/cefsharp/CefSharp/wiki/General-Usage | ||
| + | https://github.com/cefsharp/CefSharp/wiki/Trouble-Shooting#log-file | ||
| + | |||
| + | Зачастую поиск причины может затянуться, ситуация может быть нетипичной. В этом случае стоит провести сбор логов, максимально подробно описать окружение, и передать инцидент в отдел разработки ПО. | ||
Текущая версия на 18:32, 4 июня 2026
При работе с внешними модулями клиента Oktell существует вероятность появления всплывающего окна.
Появление данного сообщения говорит о возникновении проблем на этапе инициализации библиотеки CefSharp в процессе работы, при этом CefSharp переходит в "зомби-состояние".
Наиболее частыми причинами могут стать следующие:
- проблемы с каталогом %AppData%\CEF
Следует убедиться, что каталог доступен для записи и чтения для текущего пользователя, или же для того пользователя от чьего имени запускается oktell. Если каталог не представляет ценности, самым простым путем попытаться решить проблему стало бы удаление каталога. При следующем запуске клиента oktell каталог сразу же будет создан снова, если, конечно, права пользователя это позволяют.
- конфликты версий или неполнота файлов библиотеки CefSharp
Наиболее простым способом убедиться в том, что полнота файлов и соответствие версий соблюдены станет удаление клиента oktell с последующей переустановкой. При этом следует также удалить весь каталог клиента, который, как правило, расположен по пути C:\Program Files (x86)\Oktell\Client
Данный список проблем не полон, он представляет собой наиболее распространенные случаи. Ниже пойдет более подробное описание возможных ситуаций. Оно предназначено для специалистов и позволяет углубиться в понимании происходящих процессов.
Суть "зомби-состояния".
Процесс клиента продолжает работать, но CEF в нём нельзя ни инициализировать заново, ни использовать, при этом код может снова вызывать Cef.Initialize или создавать ChromiumWebBrowser — возникают повторяющиеся ошибки. Единственный надёжный способ «повторной инициализации» — полный перезапуск процесса (закрытие и новый запуск oktell.ClientStarter4).
Все причины неудачной инициализации Cef можно условно разделить на 3 группы: файлы, кэш, антивирус.
Постоянное появление упомянутого вплывающего сообщения говорит о необходимости исправления "окружения процесса" (файлы, кэш, антивирус).
1. ОГРАНИЧЕНИЯ CEF / CefSharp
1. Cef.Initialize вызывается повторно в том же процессе
После первой попытки (успешной или нет) Chromium не даёт второй полноценный init.
Типичное сообщение: «can only be called once per process»,
при этом Cef.IsInitialized может остаться false.
2. Первый Cef.Initialize завершился с ошибкой или вернул false
Нативный слой CEF считает init «использованным», повтор в этом процессе недоступен.
3. ChromiumWebBrowser создан до успешного явного Cef.Initialize
CefSharp может запустить скрытую инициализацию при создании первого экземпляра;
последующий вызов Cef.Initialize в EnsureInitialized даёт «only once».
4. Попытка Cef.Shutdown() и повторного Initialize в том же процессе
Официально не поддерживается, часто приводит к падению или нерабочему состоянию.
5. Cef.Initialize / Cef.Shutdown вызваны не из UI-потока
Риск зависания и некорректного состояния CEF.
6. Cef.Initialize и Cef.Shutdown вызваны из разных потоков
Нарушение требований CefSharp к потоку init/shutdown.
2. ГОНКИ И ПОРЯДОК ВЫЗОВОВ В КОДЕ
7. Гонка потоков при вызове EnsureInitialized без блокировки
Два потока одновременно вызывают Cef.Initialize (до добавления InitLock).
8. Игнорируется false из EnsureInitialized
После сбоя init всё равно создаётся ChromiumWebBrowser —
вторая ошибка «Cef.IsInitialized was false».
9. Ранняя инициализация в MainForm.InitializeComponent при ClientStatic.User == null
Первая (и единственная) попытка init с общим кэшем %AppData%\CEF до логина;
при сбое процесс «сгорает» до открытия браузера.
10. Разные cacheSubfolder в разных местах
(MainForm/WebFormCtrl — логин, BackBrowserControlCef/BrowserPageCef — null)
Не «only once», но повышает риск конфликтов profile и непредсказуемого первого init.
11. Несколько точек вызова EnsureInitialized
(MainForm, BackBrowser, BrowserPage, WebFormCtrl)
При ошибке на раннем вызове все последующие попадают в «зомби».
3. ФАЙЛЫ, ПУТИ, ОКРУЖЕНИЕ
12. Отсутствует oktell.ClientStarter4.exe в каталоге запуска клиента
TryResolveBrowserSubprocessPath возвращает false, init не выполняется.
13. Неверный или неабсолютный путь к subprocess, кэшу, locales, log-файлу
Для CefSharp 133+ требуются абсолютные пути.
14. Отсутствует каталог locales или некорректный LocalesDirPath
Сбой или деградация при init.
15. Нет прав на запись в %AppData%\CEF, LOG\Cef, каталог кэша или рабочий каталог
init возвращает false или падает.
16. Повреждённый или частично записанный каталог кэша %AppData%\CEF
Блокировки, ошибки profile, Initialize returned false.
17. Антивирус / DLP / политики Windows блокируют запуск subprocess CEF или запись в кэш
18. Отсутствуют или несовместимы native-библиотеки CEF
(версия CefSharp vs разрядность процесса x86/x64, неполная установка)
4. ГОНКИ ПРОЦЕССОВ И КЭШ
19. Второй экземпляр клиента с тем же RootCachePath
С CefSharp 120+ Chromium process singleton: второй процесс не может нормально
инициализировать тот же profile.
20. Зависший предыдущий процесс oktell / subprocess CEF держит lock на каталоге кэша
init текущего процесса падает.
21. SkipMutex=1 или разные TerminalAddress
Несколько экземпляров клиента одновременно, конкуренция за %AppData%\CEF.
22. Subprocess CEF (renderer, GPU и т.д.) не завершился после краша родителя
Блокировка файлов profile до перезагрузки или ручного завершения процессов.
5. КОНФИГУРАЦИЯ ПРИЛОЖЕНИЯ
23. Некорректные CefCommandLineArguments в конфиге
Неверные флаги командной строки Chromium.
24. Конфликтующие аргументы DPI / масштабирования (CefDpiUnawareScaleDefaults)
Проблемы init на части систем.
25. Неверный Cef_LogSeverity или недоступный путь к log-файлу
Косвенный сбой при создании settings (реже).
6. СОСТОЯНИЕ ПРИЛОЖЕНИЯ В МОМЕНТ INIT
26. Init вызван до готовности окружения
(нет User, неверный StartupDirectory, клиент запущен не из каталога установки)
27. Init в процессе, где уже были другие попытки работы с CefSharp
(повторная загрузка домена, тестовый код, плагин) —
единственная попытка init уже израсходована.
28. Недостаток памяти / ресурсов при старте subprocess CEF
init возвращает false, процесс остаётся неинициализированным и «заблокированным» для retry.
Справка CefSharp
https://github.com/cefsharp/CefSharp/wiki/General-Usage https://github.com/cefsharp/CefSharp/wiki/Trouble-Shooting#log-file
Зачастую поиск причины может затянуться, ситуация может быть нетипичной. В этом случае стоит провести сбор логов, максимально подробно описать окружение, и передать инцидент в отдел разработки ПО.
