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应用程序中。)
关于为什么没有在debugdiag中加载pdb文件的第二个问题。
编辑。我在32位编译,似乎没有用于32位版本的libcef.dll v3.2357.1287的pdb文件。事实上,根据cefbuilds.com,这个文件不存在。
答案 0 :(得分: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票证,试图解决潜在的问题,但目前这样做可以防止这个问题。