前一節我講了怎么設置C++崩潰時生成Dump文件 , 點擊 傳送門 , 這一節我講講怎么使用 VS2012 調試生成的 Dump 文件 , 甚至可以精確到出錯的那一行代碼上面 ;
1. 生成 Dump 文件
我在主函數寫了如下崩潰代碼 :
int main() { // 加入崩潰dump文件功能 SetUnhandledExceptionFilter(ExceptionFilter); // 使程序崩潰產生 Dump 文件 int *p = NULL; *p=1; }
雙擊運行主程序 , 產生了 Dump 文件 DumpDemo_v1.0-20170605-091215.dmp , 如下圖所示 :

2. 打開 Dump 文件
雙擊打開生成的 Dump 文件 , 會默認用 VS2012 打開並自動創建一個解決方案 , Dump 摘要信息如下 :

一定要確保 進程名稱 對應的程序路徑在本地存在 , 同時確保最初生成程序的對應 .pdb 符號文件也在當前目錄 ;
有時從客戶那里反饋回來的 Dump 文件程序路徑和本地的不一致 , 需要將程序拷貝到 Dump 信息里面的路徑中去 ;
3. 設置 Symbols 路徑
調試文件需要對應的符號文件 , 我們需要設置符號文件對應的路徑 :
在 Dump 信息摘要右上角 , 點擊 設置符號路徑 :

推薦使用 Microsoft 符號服務器 , 但第一次在線下載會有點慢 ; 當然也可以自己下載符號集文件到某個路徑 , 再講符號路徑指向該路徑 :
4. 設置源碼路徑
在左側的解決方案處右鍵點擊 屬性 -> 調試源文件 , 將源代碼的路徑添加進來 , 注意一定是解決方案所在的路徑 :

5. 調試 Dump 文件
准備工作已就緒 , 現在在 Dump 文件摘要右上角點擊 使用 僅限本機 進行調試 :

如果提示
無法找到調試信息 , 或者調試信息不匹配 , 無法查找或打開 PDB 文件, 說明沒有將最初生成程序的對應.pdb符號文件放在調試程序所在的目錄 , 或者.pdb符號文件與當前的程序版本不匹配 ;
程序會重現當時崩潰前的調用堆棧 , 如下圖所示 :

可以看出程序已經定位到了崩潰前的那一行代碼 , 非常方便排查 ;
