原文鏈接:https://blog.csdn.net/dap769815768/java/article/details/105506072
應用程序如果運行期間崩潰了,大概率是來不及記錄日志的,大部分情況下,進程並不會立即退出,而是彈出一個錯誤的彈窗。如果錯誤彈窗里面的信息有限,這個時候可以利用小型轉儲文件進行調試,查看崩潰那一刻,程序正在干什么。轉儲文件就相當於快照,記錄的是程序某一個時刻的狀態,當程序拋出異常的時候,就會停留在拋異常的那個時刻,這個時候你如果創建轉儲文件,快照記錄的正好是拋異常的時刻。快照有點像我們平時debug的時候,打的斷點,程序debug遇到斷點,停留在某一時刻,這個時刻的相關的變量的值是多少,執行到哪一步,都很清楚,dump文件記錄的大概也是這樣的一個快照。既然vs可以斷點停留,那么就意味着vs可以調試dump文件,下面是使用visual studio 2019調試dump文件的方法。
1)隨意寫一段小程序,里面包含一個空指針異常,沒有捕獲,這會導致程序崩潰。比如下面的代碼:
object obj = null;
obj.ToString();
2)把上面的小程序生成一個debug包,放到某台測試電腦上,運行它,讓他崩潰:
打開windows任務管理器,找到崩潰的進程,右鍵=》創建轉儲文件
創建成功后,找到對應的位置,把這個dmp文件拷貝到你的有調試環境的電腦。
3)打開vs。文件=》打開=》文件。打開你剛才導出的文件:
上面的圖是打開后的界面,有比較基礎的信息統計。我們可以看到進程框架那一項,是64位轉儲,如果用64位轉儲,那么你的調試器就必須是64位的。點擊使用僅限托管進行調試,就可以像debug那樣,調試dmp文件了。這個時候你可能會遇到第一個問題:
無法對此小型轉儲進行托管調試。未能找到托管的小型轉儲調試所需的庫“mscordbi.dll”(版本“4.0.30319.0”)。請在嘗試以下一個或多個步驟后重新啟動調試會話:
1. 如果此計算機當前未連接到 Internet,請連接以便能從 Microsoft 下載 dll。
2. 在“調試器”選項下的“符號設置”中指定“mscordbi.dll”的路徑。
3. 選擇“使用‘僅限本機’進行調試”。
如下圖:
這個是因為程序運行的.net環境和vs所在的環境版本不一致造成的,會提示找不到mscordbi.dll這個版本的文件,我不知道是我沒有設置好,還是vs在這一塊確實有bug,設置符號路徑並沒有用處,按照這個提示操作,也沒有任何用處,查看官方文檔,也找不到有用發的信息,網上的信息相當少。這里我提供一下我的解決方案。
a)打開程序運行電腦的這個路徑:C:\Windows\Microsoft.NET,這里包含了.net的運行庫,比如我這台測試電腦的:
一個是64位的,一個是32位的,有些人可能只有一個文件夾,沒有64位那個文件夾,這個並不影響,有的話就去對應的位數文件夾下去找,沒有,就在唯一的那個文件夾下找就行了。打開這個文件,里面就包含我們需要的mscordbi版本:
b)把紅框的整個文件夾拷貝出來,放到你的調試電腦里面,把剛才的dmp文件放到這里文件夾里面。再用vs打開dmp文件,應該就不會再提示找不到mscordbi了。如果32位的不行就試試64位的。
4)解決掉找不到mscordbi.dll的問題后,再點擊使用僅限托管進行調試,這個時候你可能會遇到第二個問題,就是找不到.pdb調試文件:
這個調試文件,必須和你打包的那個一致,如果你的程序中途修改過,重新生了pdb文件,那么你新打包的.pdb文件是不可用的,這里的解決辦法是,把你之前拷貝到測試機上的pdb文件拷貝出來到你的本地電腦里,然后點擊設置符號路徑:
點擊添加,把剛才拷貝的pdb的路徑放進去:
5)解決掉找不到pdb文件的問題后,再點擊使用僅限托管進行調試,代碼就調試起來了,可以看到程序停止的位置,和拋出的未處理的異常:
6)如果你打包的時候,勾選了優化代碼,那么一些調試信息可能會被優化掉,這個時候調試dmp文件就不一定能看到有用的信息了:
7)如果你打包的時候,設置了不生成pdb文件:
這個時候,你調試dmp文件,是找不到pdb文件的,但是有些情況下,你仍然可以看到異常信息,比如這個例子中,vs雖然提示找不到pdb文件,但是異常信息依舊打出來了:
8)默認情況下,如果你電腦里面包含源文件,vs會根據pdb信息自動定位到,但是如果沒有定位到,可以使用vs打開轉儲文件,在解決方案資源管理器里就可以看到你打開的文件,右鍵=》屬性,就可以設置源文件的路徑了:
這里要強調的是,調試dmp文件並不能百分百定位到異常發生的位置,也就是說可能並不一定能幫你定位到問題,因為程序運行出錯的那一刻和你進行轉儲的那一刻可能不在一個時間點,這個時候你的轉儲文件,是定位不到出問題的位置的。
————————————————
原文鏈接:https://blog.csdn.net/dap769815768/java/article/details/105506072