关于libcef出现关闭崩溃的情况
作者:互联网
原文地址:http://blog.csdn.net/lixiang987654321/article/details/52151855
前两篇文章介绍了如何使用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了,我的解决方法看我后续文章里的Demon)
对应的错误:
-
LogMessage::~LogMessage() {
-
stream_ << std::endl;
-
std::string str_newline(stream_.str());
-
cef_log(file_, line_, severity_, str_newline.c_str());
-
}
崩溃在日志的析构函数中!(当然Release和Debug崩溃的位置指示还有可能不一致!)
标签:libcef,浏览器,str,计数,事件,关闭,崩溃,public 来源: https://blog.csdn.net/qq_39538699/article/details/88355727