-1

CefSharp Winforms 版本 43.0.0.0,libcef.dll 3.2357.1287。

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

我正在扯掉头发,试图找出原因。让我慢下来的一件事是无法将正确的 pdb 文件连接到 dll。尽管从CefBuilds下载了它的所有变体。

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

我无法在 winform 示例应用程序中重新创建该问题,因此它对我们来说绝对是本地的,所以我目前正在将代码从左到右和中心剥离以隔离原因,但非常感谢有关如何将 pdb 文件加载到 debugdiag 的一些指导停止这个:

调试诊断错误

尽管如此:

在此处输入图像描述

libcef.dll 版本:

在此处输入图像描述

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

在此处输入图像描述

……………………………………………………………………………………………………………………………………………………………………

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

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

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

4

1 回答 1

0

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

这使我能够比较不同的实现。

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

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票来尝试解决潜在的问题,但现在这正在阻止这个问题。

于 2015-10-08T12:46:20.620 回答