首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Delphi中调试CEF3 / libcef.dll并收集关于c0000005 / 001dea9b异常的信息

如何在Delphi中调试CEF3 / libcef.dll并收集关于c0000005 / 001dea9b异常的信息
EN

Stack Overflow用户
提问于 2020-02-03 12:23:34
回答 1查看 655关注 0票数 0

我知道我的问题是多方面的,我可能会得到一些独立的建议,但非常感谢你这一切,我很抱歉,如果这是一个新手的问题。

我在Delphi 10中使用CEF (TChromium)浏览器,在客户的生产过程中经常会收到一个错误,在调试时无法复制。在显示基本的Win错误信息后,系统(Win7)终止程序,以未保存的先前工作结束。我一步一步地检查了代码中的每个元素,并要求其他程序员进行分析,这个错误似乎只适用于CEF浏览器。每次,不管我在程序的工作中能注意到什么,错误都是一样的:

代码语言:javascript
运行
复制
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 ),而且在各种论坛上找到的所有线程都被终止和/或解决了。

我试图通过显示更大的消息来编程每个页面加载,而不是关闭该程序:

代码语言:javascript
运行
复制
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组件实际上只有在我用"Load (url)“调用它时才会发生更改,那么我是否正确地理解了代码中的这个位置是我应该关注的地方?
  • 可以这样对外部库的错误/异常进行编程吗?或者有其他方法可以安全地使用它们,这样错误就不会成为杀死应用程序的原因,而是会在production?
  • Will上被控制--这个调用TChromium组件的过程给我的信息比杀死我的应用程序的系统还要多?(当然,如果这是错误位置,因为它似乎是最可靠的)
  • 我使用EurekaLog7工具-但我不知道如何使用它来跟踪浏览器库错误跟踪,在哪里调用它,甚至如何在代码中使用它。实际上,我完全不知道从哪里开始在外部库上使用它,我会很高兴地接受一些文档或提示,说明该读什么,在哪里可以找到一个可以理解的例子。

事先谢谢你,如果这太简单或者问题太蠢,我很抱歉。当然,我也知道,由于我没有提供完整的代码,这将是很难分析的问题,但我想学习这样的错误分析自己,所以也许你会原谅我。:)

~~附加信息

win 7 xs64;

  • program是一个简单的爬虫程序,其任务是将搜索页面的选定元素保存到文本文件form;

  • optional:中,这对我来说就足够了,如果这个错误触发了我自己的关闭过程,允许简单地保存结果,那么这个应用程序就可以被杀死,因为舍杜勒会让它复活;
EN

回答 1

Stack Overflow用户

发布于 2020-02-10 17:59:05

感谢@J..。我想我想出了办法来解决这个问题。

所指示的错误仅来自libcef.dll库的“工作”,而该库(不幸的是)可能不再受支持。虽然这在任何地方都不是一个解决的问题-在各种论坛上,大多数错误的迹象都出现在内存中引用错误地址的问题时,然后遵循这一思路,在不同版本中基本上都会出现内存错误。

libcef库有一些分配内存的致命方法,其本身会导致不断的内存泄漏。这些泄漏和错误分配会导致几乎所有可用内存的使用.同样的问题也很容易解决。首先,添加一个指令

代码语言:javascript
运行
复制
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}

之后

代码语言:javascript
运行
复制
uses WinApi.Windows

对于dpr表单,这个问题解决了一段时间,因为程序有更多的可用内存,而且耗尽资源需要更长的时间。当然,这并没有结束这件事,因为暂停这个计划只需要更长的时间。

但!当每隔几十次扫描(爬行)一次就可以重新定位表单的内存,这将自动分配内存,消除泄漏--也就是libcef库。我发现并使用了这种不时被调用的代码。对我来说,每20次浏览一次就足够了,但对每个人来说都是不同的。你得试试扳机。

代码语言:javascript
运行
复制
 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库中的bug的信息-和J.完成了这个话题,非常感谢你。

至于萨尔瓦多·迪亚斯·福乌的提议--我真的很感谢你参与这个项目,像你这样的人是我们社区的基础;然而,尽管CEF3还在工作,但对我来说,与其说是发现CEF4的新元素和可能性,不如说它需要我重建表单。会有时间这样做的。:)

谢谢你们!案子已经结案了!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60039176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档