1. 程式人生 > >vs2017 除錯 chromium 頻繁崩潰

vs2017 除錯 chromium 頻繁崩潰

01 vs2017 除錯chromium 頻繁崩潰

在除錯chromium程式碼的時候,vs2017有時會頻繁出現崩潰。

優先嚐試:
工具==>選項==>除錯==>常規
[一個程序中斷時則中斷所有程序] 的勾選去掉。

還可以嘗試如下操作:
1 嘗試刪除專案資料夾下面的.vs資料夾
2 %LocalAppData%\Microsoft\VisualStudio\15.0_xxx
3 嘗試安全模式啟動vs2017
在相關路徑下(C:\Program Files (x86)\Microsoft Visual Studio\2017\versioname\Common7\IDE )執行devenv /safemode

另外:編譯chromium 最好不要安裝windows 驅動開發的sdk。

4 不要載入太多符號檔案
工具==>選項==>除錯==>符號==>只加載指定項
在這裡插入圖片描述

02 其他嘗試

不知為何,更新了vs2017以後,又把chromium程式碼更新到 71,編譯debug/Release都正常。除錯debug版本,vs2017會自動無提示重啟。看vs2017異常日誌。提示記憶體不足。實際上是32GB的記憶體。應該不存在記憶體不足的問題。升級後,無法退回到15.7版本。也沒找到可以僅僅安裝15.7,不帶15.9的安裝方法。

嘗試了一下各種方法。都沒有解決除錯崩潰的問題。

直接換裝 15.9.2/15.9.1/15.8,除錯chromium 71.0.3538.xxx依然崩潰(執行正常)。
解除安裝重新安裝15.9.2,除錯依然崩潰。
安裝15.7.x(14.14 toolset),需要手工刪除 Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.14.26405。這裡面是arm相關的標頭檔案。不知道為啥win10 安裝會帶上。不過,除錯 chromium的時候依然崩潰。

依次解除安裝vs2017以安裝外掛測試,除錯chromium依然崩潰。

做如下操作也無效果
devenv /resetuserdata
devenv /resetsettings
管理員許可權:
cd D:\install\Microsoft Visual Studio\2017\Community\Common7\IDE\PublicAssemblies
gacutil -i Microsoft.VisualStudio.Shell.Interop.11.0.dll

清理vs2017的所有臨時快取,無效果

03 問題緩解

除錯chromium的x64位版本。問題得到緩解,崩潰概率稍微降低。
vs2017雖然還是32位程式,但是除錯x64的chromium,不崩潰了。
整個過程,vs2017佔用記憶體不超過4GB,chromium總記憶體除錯時,最大不到1GB。
如果除錯chromium x86版本,設定斷點後,就會頻繁崩潰。除錯chromium x64沒這個問題。

附chromium(zdx) 32位程式崩潰時記憶體使用情況圖,如下:chrome大約佔用500MB, vs2017佔用 2.9GB。處於除錯狀態後,一般就會崩潰。

在這裡插入圖片描述

應該是VS+被除錯程式的共記憶體數大約32位程式限制,就會崩潰。這個時候,vs2017崩潰,不會有提示。檢視vs2017的執行日誌(%temp%\MSBuild_pid-*),錯誤報告如下:

vs2017錯誤日誌:%temp%\MSBuild_pid-2392_bbee76ab853743a28f0b6f96d8e6378e.failure.txt

UNHANDLED EXCEPTIONS FROM PROCESS 2392:
=====================
2018-11-23 10:24:23
System.OutOfMemoryException: 沒有足夠的記憶體繼續執行程式。
   在 System.Windows.Media.Composition.DUCE.Channel.BeginCommand(Byte* pbCommandData, Int32 cbSize, Int32 cbExtra)
   在 System.Windows.Media.GlyphRun.CreateOnChannel(Channel channel)
   在 System.Windows.Media.GlyphRun.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel)
   在 System.Windows.Media.RenderData.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel)
   在 System.Windows.UIElement.RenderContent(RenderContext ctx, Boolean isOnChannel)
   在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx)
   在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle)
   在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx)
   在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle)
   在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx)
   在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle)
   在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx)
   在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle)
   在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx)
   在 System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle)
   在 System.Windows.Media.Visual.RenderRecursive(RenderContext ctx)
   在 System.Windows.Media.Visual.Render(RenderContext ctx, UInt32 childIndex)
   在 System.Windows.Media.CompositionTarget.Compile(Channel channel)
   在 System.Windows.Media.CompositionTarget.System.Windows.Media.ICompositionTarget.Render(Boolean inResize, Channel channel)
   在 System.Windows.Media.MediaContext.Render(ICompositionTarget resizedCompositionTarget)
   在 System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget)
   在 System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget)
   在 System.Windows.Media.MediaContext.Resize(ICompositionTarget resizedCompositionTarget)
   在 System.Windows.Interop.HwndTarget.OnResize()
   在 System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
   在 System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   在 System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Int32 numArgs, Delegate catchHandler)
   在 System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
   在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   在 MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   在 MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   在 MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
   在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
===================

在這裡插入圖片描述

04 停用vs2017的 ClangFormat

工具==>文字編輯器==>C/C++==>格式設定==>不勾選[啟用ClangFormat支援]

嘗試用vs自帶的clang2除錯,效果一樣。(預設使用clang編譯)

05 崩潰概率極大的一處斷點

chromium 71.0.3578.65
vs2017 15.9.2

src\google_apis\gaia\gaia_auth_fetcher.cc
void GaiaAuthFetcher::OnURLLoadComplete(

單程序除錯也崩潰 --single-process
單程序禁用外掛除錯也崩潰 --single-process --disable-plugins

06 更新vs2017 企業版測試,問題依舊

按照vs2017企業版本,帶15.9.2,15.7 toolset,問題依然存在。

工具 ==> 選項 ==> IntelliTrace ⇒ 高階 ⇒ [每個記錄所佔用的最大磁碟空間(A)],選擇100MB
工具 ==> 選項 ==> 除錯 ⇒ 符號 ⇒ [僅載入指定的模組]
診斷空間 ⇒ 屬性 ⇒ 常規 ⇒ [去掉 “啟用資源使用限制”]

07 在微軟官網社群找到一個提問。沒解決

Crash when debugging chromium
你已就此問題進行表決
報告人 alson,報告時間 2018/8/30 下午8:54:52
正在考慮Visual Studio 2017 version 15.8Windows 10.0Debuggercrash
Crash when debugging chromium
set up some break points and crashes all the time.
Did a crash dump

2018/9/11 上的 Cagri (Charlie) Aslan [MSFT]
Thanks for the feedback. Looking at the dump, Visual Studio is running out of memory. We are working on improving our memory usage during debugging for the future releases of VS. In the meantime, you can try selecting ‘load symbols only for specified modules’ option in the symbol settings dialog to help with the memory usage in the IDE.

2018/11/23 上的 wstcwps
這個問題應該是 vs2017+被除錯程式的總記憶體>3.2GB引起的。vs2017的執行日誌,在崩潰時顯示如下。UNHANDLED EXCEPTIONS FROM PROCESS 3520:=====================2018-11-23 10:47:20System.OutOfMemoryException: 沒有足夠的記憶體繼續執行程式。 在 System.Windows.Media.Composition.DUCE.Channel.BeginCommand(Byte* pbCommandData, Int32 cbSize, Int32 cbExtra) 在 System.Windows.Media.GlyphRun.CreateOnChannel(Channel channel) 在 System.Windows.Media.GlyphRun.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel)被除錯的程式採用x86的時候,設定斷點除錯,崩潰率極高。無法工作。把被除錯程式改為x64位編譯時,崩潰頻率有所降低。觀察下來,主要時被除錯程式,總體佔用記憶體在除錯時比x86編譯少。我本機除錯發生崩潰時, vs2017的總記憶體佔用大約 2.9GB。x86 chromium 記憶體佔用大約0.5GB;x64 chromium記憶體佔用大約0.3GB左右。還沒想出解決思路。少設斷點,在除錯到斷點處稍微等待後,在進行下一步操作。崩潰率會降低。

08 另外一例情況

vs2017 15.6.6 chromium67,也出現過除錯到斷點崩潰情況,不過頻率不是特別高(大約10%吧),基本是電腦執行久了會出現,vs重啟後就好了,x86/x64情況差不多,影響倒不大就沒分析原因,重啟電腦效果更好,應該還是記憶體相關問題。
這一列中,編譯關閉了clang選項。is_clang=false

09 終極解決辦法

1 vs2017工程中僅載入自己除錯的模組
2 僅載入自己除錯需要的符號檔案
工具 ==> 選項 ==> 除錯 ⇒ 符號 ⇒ [僅載入指定的模組]

10 不知道如何[只安裝vs2017的老版本]?

很遺憾,vs2017升級到15.9.0/.1/.2版本後,沒找到怎麼僅僅按照老版本15.7.x。可以按照15.7.x 的toolset。但是預設一定會被按照19.2。vs也越來越體貼了。

11 英文版本和中文版本沒有區別

安裝英文語言包,切換到英文版本除錯,出現該問題的頻率基本不變。
工具 ⇒ 選項 ⇒ 環境 ⇒ 區域設定 ⇒ 語言(切換到English,重啟vs2017)

12 期待vs2019

根據微軟官方宣傳,vs2019中將解決特大工程記憶體不足類問題。
期待vs2019 update2, 如果真能解決記憶體異常問題,除錯tensorflow程式碼能方便些。期待中…
https://docs.microsoft.com/zh-cn/visualstudio/releases/2019/release-notes-preview#debugging
微軟官方宣傳語:對於在 Windows 上執行的 C++ 應用程式,PDB 現可在單獨的 64 位程序中載入。 此更改解決了在除錯包含大量模組和 PDB 的應用程式時,由除錯程式耗盡記憶體導致的一系列故障。
在這裡插入圖片描述