2015-10-08 165 views
-1

CefSharp Winforms版本43.0.0.0,libcef.dll 3.2357.1287。CefSharp/Cef libcef.dll堆棧溢出(0xC00000FD)

當在文本框中選擇文本,然後按下屏幕鍵盤上的按鍵(不會發生在普通鍵盤上)時,我有時會在libcef.dll中發生堆棧溢出。

我抓住我的頭髮試圖隔離原因。有一件事讓我放慢了腳步,就是無法將正確的pdb文件連接到dll。儘管從CefBuilds下載了它的所有變種。

我有各種崩潰轉儲,並想知道是否有其他人有過排除這類事情的經驗。 WinDBG也可能是中文版,DebugDiag更容易遵循,但沒有有效的pdb文件根本沒有任何用處。

我不能在winform示例應用程序中重新創建問題,因此它對我們來說絕對是本地的,所以我目前正在將代碼左右分隔,並且中心隔離原因,但是真的會感謝一些關於如何加載pdb的指導文件到DebugDiag資料停止這樣的:

DebugDiag error

儘管這樣:

enter image description here

libcef.dll版本:

enter image description here

任何有興趣,這是當前崩潰線程的堆棧跟蹤:

enter image description here

...和和和...

我猜主要問題是有人知道什麼可能導致堆棧溢出? (這個問題存在於winform示例應用程序中的41.0.0中,現在它只存在於43.0.0中我們自己的應用程序中)。

第二個問題是爲什麼在debugdiag中不加載pdb文件。

編輯。我在32位編譯,似乎沒有32位版本的libcef.dll v3.2357.1287的pdb文件。實際上,根據cefbuilds.com這個文件不存在。

+0

它在'2357'分支的'更多修訂版'下,下載'Release Symbols'。你也可以從切換到'Debug'版本中受益,你必須手動下載和複製(在這種情況下,你可以切換到「調試符號」) – amaitland

回答

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票據以嘗試解決潛在問題,但現在這阻止了該問題。