CEF关闭或者退出时报错崩溃问题原因

如题,很多用户在初用cef的时候,可能会遇到在cef shutdown 或者程序退出时崩溃.

这里记录一下可能的两个原因,自己可以对照分析下。

第一个原因:

点击打开链接 ,下面是链接对应的主要内容,防止链接失效,内容我引用过来了。

前两篇文章介绍了如何使用libcef浏览器内核,不过在使用过程发现一个问题:关闭浏览器或关闭MFC窗口,调试模式下直接崩溃!

这是什么问题呢?搜索百度,仅仅看到一篇英文文章描述了改问题,首先我们关闭的时候必须要做到以下两件事:

(1)CefQuitMessageLoop 调用退出消息循环;

(2)CefShutdown 关闭浏览器并释放资源;

       其实,这两件事,在我的Demon里肯定做了,对比之前上传到网络上的Demon并没有发现什么问题,应该是后续添加导致的bug,经过排查新增功能发现,在事件处理器上保留了一个主浏览器,什么意思呢?看代码:

     class CCefBrowserEventHandler
: public CefClient
, public CefDisplayHandler// 显示变化事件
, public CefLoadHandler   // 加载错误事件
, public CefLifeSpanHandler   // 声明周期事件
//, public CefContextMenuHandler// 上下文菜单事件
//, public CefDialogHandler// 对话框事件
//, public CefDownloadHandler// 下载事件
//, public CefDragHandler// 拖拽事件
//, public CefFindHandler

       我的事件处理器中保留了某一个浏览器,在程序退出的时候浏览器是一个智能指针,cefshutdown前主浏览器因为引用计数原因使得某一个浏览器(主窗口的浏览器)没有释放,导致cef直接挂掉,保存的位置就是在CefLifeSpanHandler回调OnAfterCreated里面做的,这就导致引用计数增加,在shutdown前浏览器没有释放导致崩溃!这并不是我的代码有问题,而是cef内核必须这么限制的,可能cefshutdown前必须将所有使用的浏览器对象都析构掉,否则它在资源释放过程中检查引用计数不为0情况下回崩溃!

还有网友问我怎么解决?这不就说明原因了吗!不保留浏览器对象,防止引用计数不为0错误就ok了

上文所说的就是CefClient没有释放。

第二个原因:

类似第一个原因,只不过是反了过来.cefclienthandler类的对象由于shutdown的调用,已经析构过了.而你在其他地方(很可能是程序退出时)又再次去析构这个对象.两次释放自然崩溃.

比如duilib中,将cefclienthandler类同时作为了控件类,cefclienthandler类对象在shutdown的时候已经析构了,而在窗口关闭退出时,duilib会依照控件树来清理控件的对象.如果cefclienthandler类对象作为控件也添加到了这个控件树,那么就会被再次释放.自然就有问题了。

总结:1.cef shutdown的时候还有cef相关的对象没有释放。2.cef 相关的对象被重复释放。

以上两个原因仅是个人学习过程中对问题记录.欢迎大家补充更多原因分析。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
CEF浏览器进程的内存使用超过1GB,可能会导致崩溃或白屏现象。这可能是由于以下原因之一引起的: 1. 内存泄漏:CEF框架中的内存泄漏可能导致浏览器进程的内存使用不断增加,最终导致崩溃或白屏。你可以通过使用内存分析工具来检测和解决潜在的内存泄漏问题。 2. 资源过度使用:某些网页可能会使用大量的内存和资源,特别是在加载大型媒体文件或执行复杂的JavaScript代码。这可能会导致浏览器进程超过1GB的内存限制,并导致崩溃或白屏。你可以尝试优化网页的资源使用,例如使用更高效的图片格式、减少JavaScript执行的复杂性等。 3. 系统限制:某些操作系统可能对单个进程的内存使用有限制。如果你在操作系统上运行CEF浏览器进程遇到内存限制问题,可以尝试调整操作系统的相关设置或增加系统内存。 为了解决崩溃或白屏问题,你可以采取以下措施: - 确保使用最新版本的CEF框架,因为每个版本都可能会修复一些已知的内存问题。 - 仔细检查你的应用程序代码,特别是与CEF框架交互的部分。确保正确地释放资源和对象,避免内存泄漏。 - 如果你的网页内容较为复杂,可以考虑进行性能优化,减少资源使用和提高性能,以降低内存消耗。 - 如果问题仍然存在,可以尝试将CEF浏览器进程的内存限制设置为更高的值。但要注意,这可能会增加系统负担和性能开销。 总之,要解决CEF浏览器进程内存超过1GB导致崩溃或白屏的问题,需要综合考虑内存泄漏、资源使用和系统限制等多个方面,并进行适当的优化和调整。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值