Sean's Note: Debug
顯示具有 Debug 標籤的文章。 顯示所有文章
顯示具有 Debug 標籤的文章。 顯示所有文章

2013年10月3日 星期四

Symbols and Symbol Files

當程式做完連結 (link) 後,連結器 (Linker) 除了產生 .exe 和 .dll 檔之外,也會額外產生

symbol 檔。symbol 檔包含了執行程式時所不需要的資料,但在除錯上就極為有用:

  • 全域變數
  • 區域變數
  • 函式的名稱還有進入點的位址
  • Frame pointer omission (FPO) 的紀錄
  • 原始碼的行號

這些每一個項目都稱為 symbol,所以一個 symbol 檔會包含有很多 symbols,

symbol 檔的副檔名為 .pdb 或 .dbg,Visual C++ 6.0 Linker 之後只會產生 .pdb。


Ref: http://msdn.microsoft.com/en-us/library/windows/hardware/ff558825(v=vs.85).aspx

2013年9月30日 星期一

Symbol path for Windows debuggers

一般指定本地端的 symbol 檔路徑的指令如下,
.sympath c:\MySymbols
而 Debugger 查詢 symbol 檔的順序為:
  1. c:\MySymbols\symbols\dll
  2. c:\MySymbols\dll
  3. c:\MySymbols
  4. Current Directory
  5. Current Directory\dll

如果電腦有連接網路最有效率的方法就是直接連 Symbol Server,

srv*symbolstore

Microsoft's symbol store:

.sympath srv*http://msdl.microsoft.com/download/symbols

建議加上 Cahce:

.sympath cache*;srv*http://msdl.microsoft.com/download/symbols

cache* 是指把 symbol 檔存到 default 的本地端,下次就不用載一次。

2011年12月12日 星期一

WinDbg

微軟提供的 WinDbg 提供了許多除錯的功能,常用的例子如:

當我們想 Trace 哪些程式使用了 Windows 的 SetCursor API,

我們可以先打 x USER32!*setcursor,

x:              查詢 symbol name 的指令
user32:     欲查詢的 Module name
!:               分隔符號
*:              萬用字元
setcursor: 欲查詢的 API

搜尋結果:

777ff34b USER32!ReaderSetCursor = <no type information>
777b3075 USER32!NtUserSetCursor = <no type information>

再設定中斷點:
bp USER32!NtUserSetCursor "k; g"

即可攔截該 API 。