符號檔案 Windows 應用程式除錯必備

2021-06-06 02:55:07 字數 3884 閱讀 3189

一、何謂符號檔案?

符號檔案(symbol files)是乙個資料資訊檔案,它包含了應用程式二進位制檔案(比如:exe、dll等)除錯資訊,專門用來作除錯之用,最終生成的可執行檔案在執行時並不需要這個符號檔案,但你的程式中所有的變數資訊都記錄在這個檔案中。所以除錯應用程式時,這個檔案是非常重要的。用 visual c++ 和 windbg 除錯程式時都要用到這個檔案。

在 windows 系統中,符號檔案以 .pdb 為副檔名,比如:每個 windows 作業系統下有乙個 gdi32.dll 檔案,編譯器在編譯該 dll 的時候會產生乙個 gdi32.pdb 檔案,一旦你擁有了這個 pdb 檔案,那麼便可以用它來除錯並跟蹤到 gdi32.dll 內部。該檔案和二進位制檔案的編譯版本密切相關,比如修改了 dll 的輸出函式,再編譯該 dll,那麼原先的 pdb 檔案就過時了,不能再用老的 pdb 檔案來做除錯工作,而必須使用最新的 pdb 檔案版本。

visual c++ 編譯**後會在 debug 或者 release 目錄下生成乙個 pdb 檔案。一般情況下,符號檔案包括以下的資料資訊:

全域性變數(global variables);

區域性變數(local variables);

函式名和它們的入口位址(function names and the addresses of their entry points);

fpo 資料(frame pointer omission):frame pointer 是一種用來在呼叫堆疊(call stack)中找到下乙個將要被呼叫的函式的資料結構源**的行序號(source-line numbers);

二、如何得到和安裝符號檔案?

先確定你的作業系統(os)版本;

安裝符號檔案,對於符號檔案的安裝位置沒有特貝要求,可以安裝在任何目錄中;

設定環境變數,使得除錯工具(比如:visual c++、windbg、ntsd、drwatson 等)能找到符號檔案;

安裝符號檔案的注意事項:

如果是手動安裝符號檔案,有一點很重要,那就是宿主機(hostt computer)上的符號檔案必須與目標機器(target computer)上的 windows 版本相匹配。

這裡所謂的宿主機指的是執行除錯會話的機器,在典型的雙系統除錯會話環境中,宿主機可以是連線到目標機器的任何機器。目標機器指的是發生軟體元件、系統服務、應用程式或作業系統執行失敗的機器。也即是需要被除錯的機器,它是除錯會話關注的焦點。目標機器可以近在咫尺,也可以位於完全不同的地方。有時我們也將目標機器稱之為——被除錯者(debuggee),那麼與之對應,宿主機則可以稱為除錯者(debugger)。

三、在 visual c++ 使用符號檔案的方法

在 visual c++ 6.0 中的使用方法:

開啟 visual c++ 6.0 的 workspace 檔案(*.dsw);

進入 tools 選單,選擇 options 選單項 (tools->options);

單擊 directoties 標籤;

在 「show directories for」下拉列表中選擇 「executable files」;

將符號檔案的路徑新增到 「directories」 路徑列表中;

單擊  ok 完成;

在 visual c++ .net 2003 中的使用方法:

開啟 visual c++ .net 的專案檔案(*.vcproj);

在解決方案管理器中選中要使用符號檔案的專案;

單擊右鍵進入專案屬性對話方塊;

選擇「配置屬性」中的「除錯」;

在與「除錯」對應的「操作」選項中有乙個「符號路徑」,在此新增符號檔案的路徑即可;

單擊  「確定」 完成;

四、如何產生 release 版本二進位制檔案對應的 pdb 檔案?

在 visual c++ 6.0 中的方法:

開啟 visual c++ 6.0 的 workspace 檔案(*.dsw);

進入 project 選單,選擇 settings 選單項 (project->settings),開啟專案設定對話方塊;

在 「settings for」列表中選擇專案的 release 配置;

單擊「c/c++」標籤;

在「category」下拉列表框中選擇「general」選項;

在「debug info」下拉列表框中選擇除錯資訊格式(具體選項參見圖一),在此不必禁用任何優化選項;

單擊「link」標籤;

在「category」下拉列表框中選擇「debug」選項;

選中「debug info」核取方塊,然後選擇需要的鏈結除錯型別(具體選項參見圖一);

不要選擇「separate types」核取方塊;

重新生成(rebuild)專案;

在 visual c++ .net 2003 中的方法:

開啟 visual c++ .net 的專案檔案(*.vcproj);

進入 project 選單,選擇 settings 選單項 (project->settings),開啟專案設定對話方塊;

在 「配置」下拉列表中選擇專案的 「(活動)release」 配置;

選擇「配置屬性」樹型節點中的「c/c++」 ==〉「常規」;

設定右邊的「除錯資訊格式」選項(具體選項參見圖一);

選擇「配置屬性」樹型節點中的「鏈結器」==〉「除錯」;

設定右邊的「生成程式資料庫檔案」(具體選項參見圖一);

選擇「配置屬性」樹型節點中的「鏈結器」==〉「命令列」;

按「確定」退出;

重新生成(rebuild)專案;

圖一五、關於 free build(也稱 retail build)和 checked build(也稱 debug build)

每個基於 nt 作業系統有兩種不同的程式生成模式,即:

free build 生成的是終端使用者版本,針對生成的二進位制檔案進行了徹底的優化,禁用了除錯斷言,並剝離了除錯資訊。這樣一來使可執行程式檔案更小,載入更快,使用的記憶體也更小。

checked build 生成的是測試和除錯版本。它包含額外的 free build 所沒有的錯誤檢查,引數驗證和除錯資訊,checked build 有助於隔離和跟蹤可能導致不可預見的行為的問題,比如記憶體溢位,不正確的裝置配置。雖然 checked build 提供了額外的保護,但與 free build 比較,它需要更多的記憶體開銷和磁碟空間。由於可執行程式包含符號除錯資訊;除錯時要執行附加的**、引數檢查和輸出除錯診斷資訊,從而導致效能下降。

六、系統符號檔案的更新方法

系統符號檔案指 windows 作業系統依賴的那幾個重要的 dll/sys 和可執行檔案對應的符號檔案,常見的比如:gdi32.dll、kernel32.dll、kerberos.dll、psapi.dll、user32.dll等,使用 windbg 除錯時,你就會發現系統符號檔案(pdb)有多重要,這些檔案都與本地的 os 密切相關,比如,windows 2000 打了sp補丁的話,那麼必須更新系統符號檔案才能進行相關除錯,原來的符號檔案與打補丁後的系統就會不匹配,怎麼辦呢? 可以通過網路來更新!象下面這樣在 windbg 的 symbols path 裡面輸入路徑:

srv*d:\symbols\websymbols*
(斜體部分是你在本地儲存符號檔案的路徑)

如果你不是通過**上網,那麼在你用 windbg 開啟乙個被除錯程式後,輸入 symchk 回車,windbg 就會自動的連到微軟的**根據你的機器的情況更新的 pdb 檔案,並將它儲存在上面斜體部分指定的本地路徑裡,這樣你就可以確保你的符號檔案版本和你機器上的檔案版本一致。

如果你是通過**上網那麼你需要配置 ie 的連線設定。具體方法恕不贅言。

符號檔案 Windows 應用程式除錯必備

2006年11月10日 10 02 00 符號檔案 windows 應用程式除錯必備一 何謂符號檔案?符號檔案 symbol files 是乙個資料資訊檔案,它包含了應用程式二進位制檔案 比如 exe dll等 除錯資訊,專門用來作除錯之用,最終生成的可執行檔案在執行時並不需要這個符號檔案,但你的程...

符號檔案 Windows 應用程式除錯必備

一 何謂符號檔案?符號檔案 symbol files 是乙個資料資訊檔案,它包含了應用程式二進位制檔案 比如 exe dll等 除錯資訊,專門用來作除錯之用,最終生成的可執行檔案在執行時並不需要這個符號檔案,但你的程式中所有的變數資訊都記錄在這個檔案中。所以除錯應用程式時,這個檔案是非常重要的。用 ...

符號檔案 Windows 應用程式除錯必備

符號檔案 windows 應用程式除錯必備一 何謂符號檔案?符號檔案 symbol files 是乙個資料資訊檔案,它包含了應用程式二進位制檔案 比如 exe dll等 除錯資訊,專門用來作除錯之用,最終生成的可執行檔案在執行時並不需要這個符號檔案,但你的程式中所有的變數資訊都記錄在這個檔案中。所以...