Проблемы с запуском внешних модулей (Chromium) — различия между версиями

Материал из Oktell
Перейти к: навигация, поиск
 
(не показана одна промежуточная версия этого же участника)
Строка 1: Строка 1:
 
При работе с внешними модулями клиента Oktell существует вероятность появления всплывающего окна.
 
При работе с внешними модулями клиента Oktell существует вероятность появления всплывающего окна.
 
  [[Файл:Cef2.png]]
 
  [[Файл:Cef2.png]]
Появление данного сообщения говорит о возникновении проблем на этапе инициализации библиотеки CefSharp в процессе работы, при этом CefSharp переходит в "зомби-состояние".
+
Появление данного сообщения говорит о возникновении проблем на этапе инициализации библиотеки CefSharp в процессе работы, при этом CefSharp переходит в "зомби-состояние". <br>
  
 +
'''Наиболее частыми причинами могут стать следующие:''' <br>
 +
- проблемы с каталогом %AppData%\CEF <br>
 +
Следует убедиться, что каталог доступен для записи и чтения для текущего пользователя, или же для того пользователя от чьего имени запускается oktell. Если каталог не представляет ценности, самым простым путем попытаться решить проблему стало бы удаление каталога. При следующем запуске клиента oktell каталог сразу же будет создан снова, если, конечно, права пользователя это позволяют.
 +
 +
- конфликты версий или неполнота файлов библиотеки CefSharp <br>
 +
Наиболее простым способом убедиться в том, что полнота файлов и соответствие версий соблюдены станет удаление клиента oktell с последующей переустановкой. При этом следует также удалить весь каталог клиента, который, как правило, расположен по пути C:\Program Files (x86)\Oktell\Client
 +
 +
Данный список проблем не полон, он представляет собой наиболее распространенные случаи. Ниже пойдет более подробное описание возможных ситуаций. Оно предназначено для специалистов и позволяет углубиться в понимании происходящих процессов.
  
 
== Суть "зомби-состояния". ==
 
== Суть "зомби-состояния". ==
Строка 15: Строка 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

Текущая версия на 16:52, 4 июня 2026

При работе с внешними модулями клиента Oktell существует вероятность появления всплывающего окна.

Cef2.png

Появление данного сообщения говорит о возникновении проблем на этапе инициализации библиотеки 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