c++ - 应用程序退出时 CEF 崩溃(QT5+CEF3.2526)

标签 c++ qt crash chromium-embedded

这是一个非常简单的QT+CEF Windows应用程序,参见https://github.com/GreatTux/CefMinGWQt

当我关闭主窗口时CEF触发断点: 我想我在这里失败了:

void CefBrowserMainParts::PostMainMessageLoopRun() {
....
#ifndef NDEBUG
// No CefBrowserContext instances should exist at this point.
DCHECK_EQ(0, CefBrowserContext::DebugObjCt);
#endif
}

我不知道释放浏览器资源的正确方法是什么,我在网上看了很多例子,几乎所有的例子都在我的Windows 7+vs2010环境下遇到了这个问题

我也尝试过,但不起作用

void ClientHandler::OnBeforeClose(CefRefPtr<CefBrowser> browser) {
  if(m_browser.get())
    m_browser = NULL;

====跟踪===

libcef.dll!base::debug::BreakDebugger()  Line 21    C++
libcef.dll!logging::LogMessage::~LogMessage()  Line 604 C++
libcef.dll!CefBrowserMainParts::PostMainMessageLoopRun()  Line 189  C++
libcef.dll!content::BrowserMainLoop::ShutdownThreadsAndCleanUp()  Line 946 + 0x27 bytes C++
libcef.dll!content::BrowserMainRunnerImpl::Shutdown()  Line 293 C++
libcef.dll!CefMainDelegate::ShutdownBrowser()  Line 659 + 0x1b bytes    C++
libcef.dll!CefContext::FinalizeShutdown()  Line 462 C++
libcef.dll!CefContext::Shutdown()  Line 345 C++
libcef.dll!CefShutdown()  Line 171  C++
libcef.dll!cef_shutdown()  Line 192 C++
qtloop.exe!CefShutdown()  Line 180 + 0x8 bytes  C++
qtloop.exe!main(int argc=1, char * * argv=0x00375b90)  Line 35  C++
qtloop.exe!WinMain(HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ *    __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000, HINSTANCE__ * __formal=0x00fe0000)  Line 113 + 0xd bytes C++
qtloop.exe!__tmainCRTStartup()  Line 547 + 0x2c bytes   C
qtloop.exe!WinMainCRTStartup()  Line 371    C

最佳答案

When you close the mainwindow, Qt not destory it immediately, so cef browser not release. And at this time app.exec() was return, and CefShowDown() was run and trigger the debug check.

我也遇到了同样的问题。 这是因为当你关闭Cef时还有不免费的浏览器

DCHECK_EQ(0, CefBrowserContext::DebugObjCt);

我读了这篇文章并阅读了cef close过程的源代码
https://github.com/fanfeilong/cefutil/blob/master/doc/CEF_Close.md

问题我解决了,关键是,当你打电话的时候

GetHost()->CloseBrowser(false)

在cef上嵌入父窗口的closeEvent并忽略第一个closeEvent

如果用户允许关闭,那么 cef 将再次向父根窗口发送 close 消息。

void CefBrowserHostImpl::PlatformCloseWindow() {
  if (window_info_.window != NULL) {
    HWND frameWnd = GetAncestor(window_info_.window, GA_ROOT);
    PostMessage(frameWnd, WM_CLOSE, 0, 0);
  }
}

当您收到第二次关闭时,您需要确保立即关闭窗口并销毁cef嵌入的窗口。 Cef 需要 WM_DESTROY 事件来释放资源并调用 OnBeforeClose。

关于c++ - 应用程序退出时 CEF 崩溃(QT5+CEF3.2526),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38716266/

相关文章:

c++ - 限制 CPU 速度以进行分析

c++ - memory_order_seq_cst 栅栏什么时候有用?

c++ - 使用 Qt 从 SQLite 中选择

windows - 我在哪里可以获得 dll 以在 Windows 上的 Qt 中部署应用程序?

iphone - 在没有 NSZombie 的情况下追踪 EXC_BAD_ACCESS?

c++ foreach循环使用指针而不是引用

C++ 预处理器 __typeof

c++ - QT 从主类中声明 Mainwindow

crash - 我的 Windows 8 Store 应用程序在应用程序认证工具包中崩溃,我如何找出原因?

objective-c - iOS 应用仅在不调试时崩溃