CEFSharp崩溃分析及解决办法

2 篇文章 0 订阅
1 篇文章 0 订阅

CEFSharp是我们做.NET桌面程序嵌入网站的一大利器,但是它也存在着各种各样的奇葩问题,尤其是遇到机器配置比较低的时候。

背景

就好比我们项目上的一个客户机上,只安装了4G内存,而且客户开着程序一直不关闭(可能持续了很多天),这样就导致了内存只增不减(当然也有可能是我们前端网站的问题,单页vue程序,用了比较多的全局缓存变量),结果就是导致CEFSharp的其中一个子进程崩掉了,界面变成了白屏。。。

a5fe2de5a0f34ca199b4b6e6698784b1.png

这客户一看当然很不爽了,只会认为是我们程序的问题。

原因分析

经过分析,CEFSharp承载网页时,它会开启6个名为CefSharp.BrowserSubprocess.exe的子进程,如下:

  • browser
  • gpu-process
  • utility
  • utility
  • renderer
  • renderer

当内存达到上限时(默认大概是1GB左右,64位机器上试验的),gpu-process这个进程就会崩掉,从而导致界面白屏。异常日志信息如下:

ERROR:v8_initializer.cc(688)] V8 javascript OOM: (Reached heap limit).
INFO:crash_reporting.cc(211)] Crash reporting enabled for process: gpu-process
ERROR:gpu_init.cc(481)] Passthrough is not supported, GL is disabled, ANGLE is

 当然你也可以通过杀进程的方式来重现白屏,不过最好还是通过代码的方式来模拟内存溢出比较接近于实际的情况。比如来个for循环拷贝window对象,部分代码如下

<template>
  <div style="display: flex">
      <input v-model:value="times"></input>
      <button @click="loop()">循环{{ loopData.length }}</button>
  </div>
</template>

export default {
  name: 'HeapDemo',
  data() {
    return {
      loopData: [],
      times: 100000,
  },
  methods: {
    loop() {
      for (let index = 0; index < this.times; index++) {
        this.loopData.push(Object.assign({}, window));
      }
  }
}

解决办法

既然是由于内存上限导致的,那么就来给CEFSharp增加内存使用上限,代码如下:

var setting = new CefSettings();
//其他代码忽略......

//设置浏览器可使用的最大内存值为2GB(2048)
setting.CefCommandLineArgs.Add("--js-flags", $"--max_old_space_size=2048");

if (!Cef.IsInitialized)
{
    Cef.Initialize(setting);
}

这样可以最大限度的减少崩溃的几率,还有一种方式就是监控CefSharp.BrowserSubprocess.exe进程,当发现进程数少于6个时,就重新加载CEF浏览器,这样可以避免gpu-process崩溃时,程序界面一直处于白屏状态。

上述都是一种折中方案,虽然不是治本的方式,但是比较有效的快速解决方案。

要想彻底解决,最终还是要从前端源码来分析,减少不必要的内存开销!

 

 

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF是一种用于构建Windows桌面应用程序的技术,而CefSharp是一个开源的基于Chromium的.NET库,用于在WPF应用程序中嵌入Web浏览器控件。当我们想要在WPF应用程序中解决视频问题时,我们可以通过以下几种方法来实现。 首先,我们可以使用CefSharp的强大功能来加载网页中的视频。CefSharp可以加载html,css和JavaScript,因此我们可以在WPF应用程序中嵌入具有视频播放功能的网页。我们只需要在XAML中添加一个CefSharp的WebBrowser控件,然后在代码中使用CefSharp的API来加载网页。通过使用CefSharp提供的JavaScript绑定功能,我们还可以与网页中的视频进行交互。 其次,我们可以使用CefSharp提供的自定义渲染功能来实现视频播放。CefSharp允许我们通过继承CefSharp控件,重写其中的渲染方法来实现自定义的渲染逻辑。通过对视频元素的渲染进行特殊处理,我们可以使视频在WPF应用程序中进行播放。 另外,我们还可以使用CefSharp的事件和回调功能来处理视频的相关事件。CefSharp提供了与网页中的视频播放相关的事件,如视频已加载,播放中,暂停等。我们可以通过订阅这些事件来实现对视频的控制和交互。 总结来说,通过使用WPF和CefSharp,我们可以轻松解决在WPF应用程序中播放视频的问题。无论是加载网页中的视频,还是自定义视频的渲染逻辑,还是处理视频的各种事件,CefSharp都提供了丰富的功能和API来帮助我们实现这些需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值