2008年10月1日 星期三

VC中的系統符號檔

嗯,今天跟大家介紹個工具。

先來一段小程式片段。裡面有一個故意弄的Bug。

HANDLE hFile=CreateFile(…);

CloseHandle(hFile);
CloseHandle(hFile);

我把檔案關了兩次,所以在執行的時候,就會crash,call stack看起來像是底下的圖。

callstack_nosymbol

程式死在kernel32.dll, ntdll.dll 這些系統 dll 裡面,啊..束手無策..

接著我對VC做了點調整,加了些東西,crash 時候的 call stack 變成這樣,

callstack_withsymbol

咦? Kernel32.dll 裡的 CloseHandle() 當掉?

這個調整很簡單,打開 VC選單的Tools->Options,然後照著以下的設定,

vc8_symbol_setting

切換到Debugging裡面的Symbols項目,在symbol file locations填入 http://msdl.microsoft.com/download/symbols,接著在cache目錄的欄位,指定一個要存放pdb檔案的目錄。

設定好了之後,重新開始debug程式。第一次執行程式,會很花時間,因為這個時候,VC需要先下載程式用到的每一個系統dll檔的符號檔 (symbol file, *.pdb),放到設定的cache目錄中。

然後在程式當掉的時候,call stack就會多了這一些資訊。

要把這個功能關掉的話,就在上面的這個設定畫面,把symbol file locations的打勾選項都取消掉,也不要指定cache目錄。(硬碟裡面的檔案都還會留著,下次不用重新下載…)

沒有留言: