Как я могу отладить CEF3 / libcef.dll в Delphi и собрать информацию об исключении c0000005 / 001dea9b - PullRequest
0 голосов
/ 03 февраля 2020

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

Я использую Браузер CEF (TChromium) в Delphi RAD 10. Я регулярно получаю сообщение об ошибке на производстве заказчика, которое не могу воспроизвести при работе с отладчиком. После отображения информации об ошибке basi c Win система (Win7) убивает программу, что завершается несохраненной предыдущей работой. Я проверил каждый элемент кода шаг за шагом, попросил коллег-программистов провести анализ, и кажется, что эта ошибка относится только к браузеру CEF. Каждый раз, независимо от того, что я могу заметить в работе программы, ошибка одна и та же:

Problem signature:
  Problem Event Name:   APPCRASH
  Application Name: MyApp.exe
  Application version:  0.0.0.0
  Application timestamp:    5e36d888
  Module name with error:   libcef.dll
  Module version with error:    3.2454.1344.0
  Module timestamp with error:  562d8f27
  Exception Code:   c0000005
  Exception Offset: 001dea9b
  OS Version:   6.1.7601.2.1.0.256.1
  Locale ID:    1045
  Additional information 1: 0a9e
  Additional information 2: 0a9e372d3b4ad19135b953a78882e789
  Additional information 3: 0a9e
  Additional information 4: 0a9e372d3b4ad19135b953a78882e789

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

К сожалению, я не смог понять, что именно вызывает эту проблему (исключение libcef.dll c0000005 / 001dea9b), и все темы, найденные на различных форумах, прерваны и / или не устранены.

I пытался запрограммировать загрузку каждой страницы, отображая сообщение большего размера вместо закрытия программы:

procedure LoadUrl(url: String);
begin
  try
  Form1.Chromium1.Load(url);
  except
    on E : Exception do
      ShowMessage('CEF: '+E.ClassName+' error raised, with message : '+E.Message);
  end;
end;

Но при работе с отладчиком я не получаю никакой ошибки (снова), а в производственной системе просто убивает приложение без каких-либо сообщений об ошибках.

На первый взгляд, Я думаю, мне нужно объяснение :

  • TChromium Component На самом деле он меняется только тогда, когда я вызываю его с помощью «Load (url)», поэтому я правильно понимаю, что это место в коде - то, на чем я должен сосредоточиться?
  • Могу ли я программировать ошибки / исключения внешних библиотек таким образом? Или, может быть, есть какой-то другой способ их безопасного использования, так что ошибка не будет причиной для уничтожения приложения, но будет контролироваться на производстве?
  • Будет ли эта упомянутая процедура, вызывающая компонент TChromium, дать мне больше информации чем система, которая убивает мое приложение? (Конечно, если это место с ошибкой, потому что оно кажется самым верным выстрелом)
  • Я использую инструмент EurekaLog7 - но я не могу понять, как его использовать, чтобы отслеживать трассировку ошибок библиотеки браузера и где это назвать, или даже как взять это в коде. На самом деле, я абсолютно не знаю, с чего начать использовать его во внешней библиотеке, я с удовольствием приму некоторую документацию или подсказку о том, что читать и где я найду понятный пример.

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

~~ Дополнительная информация

  • Программа получила структуру x32, запущена в win 7 xs64;
  • Программа представляет собой простой сканер, задачей которого является сохранение выбранного элементы найденных страниц в виде текстового файла;
  • необязательно: мне достаточно, если эта ошибка удастся запустить мою собственную процедуру завершения работы, позволяющую просто сохранить результаты, приложение может быть убито после того, как будет запущен sheduler воскресит его;

1 Ответ

0 голосов
/ 10 февраля 2020

Спасибо @J ... думаю, я понял это и вот решение.

Указанная ошибка возникает только из-за "работы" библиотеки libcef.dll, которая (к сожалению), вероятно, больше не поддерживается. Хотя эта проблема нигде не решена - большинство признаков этой ошибки на различных форумах появляются, когда существует проблема со ссылкой на неправильный адрес в памяти, а затем, следуя этому примеру, в основном около из-за ошибки памяти в различных версиях.

Библиотека libcef имеет некий фатальный способ выделения памяти и сама по себе приводит к постоянным утечкам памяти. Эти утечки и неправильное распределение быстро приводят к использованию практически всей доступной памяти ... и подобную проблему легко получить. Прежде всего, добавление директивы

{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

после

uses WinApi.Windows

к форме dpr на некоторое время решает проблему, потому что у программы больше доступной памяти, и на ее исчерпание уходит больше времени. Ресурсы. Это, конечно, не конец вопроса, потому что приостановка программы просто займет больше времени.

Но! Достаточно, когда каждые несколько десятков сканирований (обходов) один перемещает память для формы, которая автоматически выделяет память, устраняет утечки - также с точки зрения библиотеки libcef. Я нашел и использовал такой код, который время от времени вызывается. Мне было достаточно делать то, что каждые 20 ходов браузера, но это может выглядеть по-разному для всех. Вам нужно попробовать триггер.

 procedure TrimAppMemorySize;
 var
   MainHandle : THandle;
 begin
   try
     MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID) ;
     SetProcessWorkingSetSize(MainHandle, $FFFFFFFF, $FFFFFFFF) ;
     CloseHandle(MainHandle) ;
   except
    on E : Exception do
     // inform me about problem 
   end;
   Application.ProcessMessages;
 end;

Возможно, это не лучшее решение, но оно делает нестабильную форму с CEF3 стабильной и готовой к работе. В течение нескольких дней, работая над несколькими копиями одной и той же формы, никаких ошибок не возникало, поэтому это может быть хорошим решением, может быть, для всех, у кого есть утечки памяти с CEF3, есть неизвестные ошибки, подобные моей, или ошибка нехватки памяти, вызванная CEF3.

Однако - мой вопрос был о том, как отлаживать libcef.dll и как получить больше информации об ошибках в библиотеке CEF3 - и J ... завершил топи c, большое спасибо.

Что касается предложения SalvadorDíazFau - я очень ценю ваше участие в проекте, такие люди, как вы, являются основой нашего сообщества; однако, хотя CEF3 все еще работает, для меня это меньше работы, чем открытие новых элементов и возможностей CEF4, которые потребовали бы от меня перестройки формы. Там будет время для этого. :)

Спасибо, ребята! Дело уже закрыто!

...