CefSharp/Cef libcef.dll 堆栈溢出 (0xC00000FD)

CefSharp/Cef libcef.dll stack overflow (0xC00000FD)

CefSharp Winforms 版本 43.0.0.0,libcef.dll3.2357.1287。

在文本框中选择文本,然后按下屏幕键盘上的某个键(在普通键盘上不会发生)时,我有时会在 libcef.dll 中出现堆栈溢出。

我正在努力找出原因。让我慢下来的一件事是无法将正确的 pdb 文件连接到 dll。尽管从 CefBuilds.

下载了它的所有变体

我有各种故障转储,想知道是否有其他人有解决此类问题的经验。 WinDBG 也可能是中文的,DebugDiag 更容易理解,但如果没有有效的 pdb 文件,两者都没有任何用处。

我无法在 winform 示例应用程序中重现该问题,所以它绝对是我们本地的问题,所以我目前正在从左到右和中心撕开代码以找出原因,但非常感谢有关如何加载的一些指导pdb 文件到 debugdiag 以停止此操作:

尽管如此:

libcef.dll版本:

对于任何感兴趣的人,这是当前崩溃线程的堆栈跟踪:

...等等...

我想主要问题是有人知道什么可能导致堆栈溢出吗? (这个问题在winform示例应用中41.0.0存在,现在只存在于我们自己的43.0.0应用中)。

第二个问题是为什么没有在 debugdiag 中加载 pdb 文件。

编辑。我正在用 32 位编译,似乎 libcef.dll v3.2357.1287 的 32 位版本没有 pdb 文件。事实上,根据 cefbuilds.com 这个文件不存在。

看来虽然我无法使用 winform 示例的主窗体重新创建问题,但我可以同时使用其 SimpleBrowserForm.cs。

这让我可以比较不同的实现。

在主窗体中,一旦浏览器控件被初始化,就会创建一个 hacky 消息循环拦截器,以将内部 WM_MOUSEACTIVATE 事件向上传递到父容器。这似乎是为了确保如果上下文菜单在收到点击时打开,它将被点击事件关闭(chromium 似乎抑制了内部鼠标点击)。

private void OnIsBrowserInitializedChanged(object sender, IsBrowserInitializedChangedEventArgs args)
    {
        if (args.IsBrowserInitialized)
        {
            ChromeWidgetMessageInterceptor.SetupLoop((ChromiumWebBrowser)Browser, (message) =>
            {
                const int WM_MOUSEACTIVATE = 0x0021;
                const int WM_NCLBUTTONDOWN = 0x00A1;

                if (message.Msg == WM_MOUSEACTIVATE) {
                    // The default processing of WM_MOUSEACTIVATE results in MA_NOACTIVATE,
                    // and the subsequent mouse click is eaten by Chrome.
                    // This means any .NET ToolStrip or ContextMenuStrip does not get closed.
                    // By posting a WM_NCLBUTTONDOWN message to a harmless co-ordinate of the
                    // top-level window, we rely on the ToolStripManager's message handling
                    // to close any open dropdowns:
                    // http://referencesource.microsoft.com/#System.Windows.Forms/winforms/Managed/System/WinForms/ToolStripManager.cs,1249
                    var topLevelWindowHandle = message.WParam;
                    PostMessage(topLevelWindowHandle, WM_NCLBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
                }
            });
        }
    }

无论如何,有了这个奇怪的小技巧,我的堆栈溢出崩溃就消失了。

我已经提出了 github 请求来尝试解决潜在的问题,但目前这正在阻止这个问题。