丟掉VS.NET,用 WinDbg 才是王道 Part 1


在 debug 時最常用到的就是 symbol file / symbol server,然而相信常有 load 不到 symbol file 的經驗,不管怎麼按,怎麼換,不對就是不對,有時覺得明明就放對了,還是不能用 Orz。如果你用的是 VS.NET,應該永遠都只能繼續怨天尤人、哭天搶地了,但如果你用的是 windbg 的話,那麼請照著下面步驟來解決這個問題。
例如我在追查memory leak的時候,去分析一個 address 的 call stack

!heap -p -a 0x12344545
結果得到的 callstack 非常詭異,一看就覺得不可能,或著它很明顯的告訴你「Following frames may be wrong」,那們八成是 symbol 不正確了
首先要先判斷為什麼 load 不到,先用 sym 打開 symbol 的詳細訊息
!sym noisy
此時重新執剛才的指令 !heap -p -a 0x12344545, 此時它便會告訴你它有那些 symbol file 是有問題的
  1. checksum 不正確
    1. 如果你確定 symbol (.pdb) 是對的, 或著你是重新用一模一樣的 compiler setting 所編出來的 pdb,那麼你可以試看看強制忽略 checksum
    2. .reload /f /i [xxxxx.exe]
  2. 根本找不到 .pdb
    1. 請注意看 message,它會告訴你它在那些目錄下搜尋過 pdb,看一下你的 pdb 是不是真的放對位置了吧! (如果你連 symbol path都不會設,趕快去翻一下手冊吧)
通常這樣就可以解決大部份的問題了, 而 !sym noisy 還可以顯示  .pdb 中的一些警告資訊,如 source index 沒有做之類的, 相當有幫助。
最後別忘了用 !sym quiet 把 message 關閉,才不會看到一堆沒有用的訊息。

0 comments