CefInitialize崩溃 && Cef白屏

新建一个MFC Dialog工程,然后仿照CefSimple模仿实现自己的一个基于MFC窗口的Demo(具体代码稍后上),注意我仅仅只配置了所需要依赖的lib,并没有把CefSample的配置一起Copy,所以才导致后面的白屏,浪费了我一天时间。
坑一:CefInitialize崩溃
也许这个坑很多网友都遇到过,所以寻找度娘的时候问题很快就解决了,就是exe运行环境缺少必须要的资源包(不仅仅dll,所以图方便我们直接从CefSimple环境拷贝出来)。
在这里插入图片描述
坑二:Cef白屏
当出现白屏的时候我第一反应就是代码有bug,于是我从MFC工程切换到win32工程,从子窗口切换到Popup,各种尝试都不行,最后我把CefSimple整个工程拷贝过来,然后按照我的配置修改编译依旧白屏,此刻问题基本确定:工程配置不对。但是工程配置有什么不对呢?只能一点点的比较,终于在最后发现:后期生成事件没有配置。命令如下:

setlocal
mt.exe -nologo -manifest "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/cefsimple.exe.manifest" "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/compatibility.manifest" -outputresource:"E:/project/CefDemo/x64/Debug/cefsimple.exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/chrome_elf.dll E:/project/CefDemo/x64/Debug/chrome_elf.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/d3dcompiler_43.dll E:/project/CefDemo/x64/Debug/d3dcompiler_43.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/d3dcompiler_47.dll E:/project/CefDemo/x64/Debug/d3dcompiler_47.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/libcef.dll E:/project/CefDemo/x64/Debug/libcef.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/libEGL.dll E:/project/CefDemo/x64/Debug/libEGL.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/libGLESv2.dll E:/project/CefDemo/x64/Debug/libGLESv2.dll
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/natives_blob.bin E:/project/CefDemo/x64/Debug/natives_blob.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/snapshot_blob.bin E:/project/CefDemo/x64/Debug/snapshot_blob.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/v8_context_snapshot.bin E:/project/CefDemo/x64/Debug/v8_context_snapshot.bin
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_directory H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Debug/swiftshader E:/project/CefDemo/x64/Debug/swiftshader
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef.pak E:/project/CefDemo/x64/Debug/cef.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef_100_percent.pak E:/project/CefDemo/x64/Debug/cef_100_percent.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef_200_percent.pak E:/project/CefDemo/x64/Debug/cef_200_percent.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/cef_extensions.pak E:/project/CefDemo/x64/Debug/cef_extensions.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/devtools_resources.pak E:/project/CefDemo/x64/Debug/devtools_resources.pak
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_if_different H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/icudtl.dat E:/project/CefDemo/x64/Debug/icudtl.dat
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd
setlocal
"D:\Program Files\CMake\bin\cmake.exe" -E copy_directory H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/Resources/locales E:/project/CefDemo/x64/Debug/locales
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

上面命令主要实现两个功能:
1.将manifest 文件嵌入到exe内部。
2.将所依赖的文件copy到运行环境(所以如果配置了这个生成后事件,那么问题一就不需要手动拷贝依赖项了)。

manifest 文件学习参考:

  1. 什么是vs 程序的manifest文件
  2. exe或者dll 嵌入manifest文件方法
  3. VS2008 manifest文件简单应用

所以白屏的根本原因是缺少manifest文件,导致运行的时候出问题。
解决方法两种:

  1. 把上面的代码完整Copy到生成后事件里面去【记得修改自己的工程目录
  2. 如果之前已经把必要的文件和资源Copy到了运行环境,那么我们只需要Copy如下一段代码就OK啦(功能就是把manifest文件嵌入exe内部)【记得修改自己的工程目录】:
setlocal
mt.exe -nologo -manifest "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/cefsimple.exe.manifest" "H:/cef/cef_binary_3.3538.1852.gcb937fc_windows64/tests/cefsimple/compatibility.manifest" -outputresource:"E:/project/CefDemo/x64/Debug/cefsimple.exe";#1
if %errorlevel% neq 0 goto :cmEnd
:cmEnd
endlocal & call :cmErrorLevel %errorlevel% & goto :cmDone
:cmErrorLevel
exit /b %1
:cmDone
if %errorlevel% neq 0 goto :VCEnd

下一章节将描述如何把Cef作为一个子窗口集成到MFC工程和win32工程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值