轉載:https://blog.csdn.net/zfs_kuai/article/details/43646665
轉載:https://blog.csdn.net/i_chaoren/article/details/81453142
一、什么是PDB文件
1. PDB文件是"程序數據庫" Program Data Base的簡稱,包含的程序的代碼信息
2.通過這個文件我們可以查看對應斷電的位置,堆棧信息等內容
3.使用PDB使得我們無需代碼也可以掌握程序的堆棧運行狀態
二、PDB文件
1.由鏈接器自動生成
2.文件由兩部分構成,私有符號數據(private symbol data )和 公共符號表(public symbol data)
私有符號數據(Private Symbol Data)
函數
全局變量
局部變量
用戶定義的結構體,類,數據類型
源文件的名稱和源文件中每個二進制指令的行號
公共符號表(Public Symbol Table)
靜態變量
全局變量(external)
三、如何得到PDB文件
程序編譯之后會在Debug或者是Release目錄下生成*.pdb文件
四、什么是dump文件
dump文件是附加堆棧信息的存儲文件的簡稱,文件擴展名“.dmp”,通過dump文件我們可以得到程序運行某一時刻的堆棧數據。
當我們程序意外崩潰后,通常程序會立即中斷運行,此時我們生成這一時刻的dump文件就可以通過此時的堆棧進行分析,找到崩潰的代碼並分析原因。
當程序遇到未處理異常(主要指非指針造成)導致程序崩潰死,如果在異常發生之前調用了SetUnhandledExceptionFilter()函數,異常交給函數處理。
MSDN中描述為:
Issuing SetUnhandledExceptionFilter replaces the existing top-level exception filter for all existing and all future threads in the calling process.
因而,在程序開始處增加SetUnhandledExceptionFilter()函數,並在函數中利用適當的方法生成Dump文件,即可實現需要的功能。
Dump文件是進程的內存鏡像。可以把程序的執行狀態通過調試器保存到dump文件中。
五、EXE、DLL等與pdb文件的匹配
調試器是如何來判別EXE、DLL等是否和一個pdb文件匹配呢?
每次我們鏈接EXE或者DLL或者SYS的時候,鏈接器都將產生一個唯一的GUID,然后將其寫入到PDB和可執行文件。調試器加載的時候將檢查兩者的GUID,如果一致就表示他們匹配。
注:如果我們需要調試,我們需要查dmp文件,那么請妥善保管好自己的代碼和pdb。每次重新編譯,即使所有代碼均沒有變化,他們的GUID也不同。
六、編譯器產生符號的過程
如果指定生成調試信息,編譯器在每次編譯完文件以后就會產生一個obj文件,然后同時產生它對應的調試信息。當我們進行連接的時候,編譯器就會幫我們把所有obj統一編譯為一個可執行文件,然后所有的調試信息統一生成一個PDB文件。
七、Release程序生成pdb文件
用VS調試Release的程序,發現無法調試。其實,並不是Release的程序不能調試,而是沒有讓Release的程序生成pdb文件,VS無法加載pdb文件而無法調試程序。
設置一下,讓Release的程序也生成pdb文件,就好了。
八、本地dump調試
直接用VS打開Test.dmp文件,測試時dmp文件是本地產生的,因此VS會依據dmp文件自行找到exe,pdb和源代碼的路徑。因此直接點擊調試,程序會出錯代碼行中斷
十、無源代碼dump調試
但若dmp文件是exe在另一台機器上產生的,則我們最好把exe,pdb,dmp放到同一文件夾下,必須保證pdb與出問題的exe是同一時間生成的,用VS打開dmp文件后還需要設置符號表文件路徑和源代碼路徑。
(1)當把pdb文件與dmp文件放入同一目錄下時,就不需設置其路徑,否則需要設置
工具->選項->調試->符號:
(2)還需設置源代碼路徑:
屬性->調試源代碼:
這樣點擊“使用僅限本機進行調試”,即可在出錯代碼行中斷:
WinDbg調試
基本思路與VS一致,winDbg會提供更為全面的調試信息
(1)設置pdb路徑:File ->Symbol File Path
(2)設置exe路徑:File -> Image File Path
(3)設置源代碼路徑:File -> Source File Path(指sln所在目錄)
(4)打開dmp文件:File ->Open Crash Dump
(5)執行命令 !analyze –v
可以得出詳細的異常分析