2017年9月22日 星期五

Windows的傾印檔 (Dump File)

甚麽來的?

這是一個程式在某個瞬間的快照(Snapshot),可把當時程式的運行狀態以及使用的記憶體像照片一樣拍下來,之後便可在開發軟件內嘗試重現當時的情況。在程式不知道為何出錯時,如果能取得它當時的Dump file,對於debug找出問題所在是很有用的。

下面介紹在Windows取得傾印檔的方法。

如何取得

當程式在運行途中出現錯誤而被終止運行(Crash/Terminated)的時候,作業系統有時會幫它儲存一個傾印檔(Dump File)。你也可以選擇自己開啓Task manager,在該程式名稱上按右鍵選擇Create Dump File,又或者使用微軟提供的procdump.exe來監視一個程式:

procdump -t PID

記得填入該程式的Process ID,可在程式開啟後Task Manager查到。
procdump還有許多功能,可看:https://docs.microsoft.com/en-us/sysinternals/downloads/procdump

取得之後如何使用


在取得Dump File後,可以開啓Visual Studio或者WinDbg之類的軟件來打開。
只要載入正確的Symbols檔(一般是pdb,可以幫你指出exe中的某行是source code的哪一行),再加上source code,便可得悉程式是在運行到哪一行時出錯,方便debug。

注意:

  1. 如果程式是使用Release模式編譯的,因為經過最佳化(Optimization),不一定能夠和source code一行一行對應,因此頂多只能知道大概的位置,而不能準確指出是哪一行出問題。
  2. 有時候程式或者函式庫會自帶Exception handler,即是某行出錯時會被handler抓到,然後在handler function內執行後再把Exception交給上面,最後才終止運行。這種時候我們需要查找Exception object或pointer中的Stack Trace,它上面會寫原本出問題的是哪一行。可參考:https://support.microsoft.com/en-us/help/313109/how-to-find-the-problem-exception-stack-when-you-receive-an-unhandlede
  3. 記得在編譯程式的時候保留當時的source code以及pdb!pdb是用來儲存debug information,包括exe中的machine code對source code的mapping。一定要保留在編譯exe時一起編譯的pdb,因為只要source code稍有改動後編譯出來的exe已經是完全不同的東西,不配對的pdb是無法debug的。