1. 程式人生 > >關於VS2010的除錯資訊即.pdb檔案

關於VS2010的除錯資訊即.pdb檔案

在執行FBX的sample程式時發現提示:debug information of xxx.exe cannot be found or not match ,於是首先在網上找了下相關資料,得到如下建議:

1) Goto Project->HelloWorld Properties
2) On the left expand "Configuration Properties"
3) Expand "C/C++"
4) On the left, Select "General"
5) On the right, change "Debug Information Format" to "Program Database For Edit And Continue (/ZI)"
5) On the left, Select "Optimization"
6) On the right, change "Optimization" to "Disabled (/Od)"
7) On the left, expand "Linker"
8) On the left, select "Debugging"
9) On the right, change "Generate Debug Info" to "Yes"
10) Click ok
11) Set your breakpoints
12) Rebuild your application

實際上按照以上操作以後,問題仍然存在,因為對Visual配置不是很熟,於是繼續看其他人的文章,覺得有可能是.pdb檔案的原因,因為pdb檔案是Visual儲存除錯資訊的地方,而visual在執行時確實有如下提示:

'ImportExport.exe': Loaded 'C:/Program Files/Autodesk/FBX/FbxSdk/2012.1/bin/ImportExport/win32/net2010/debug/ImportExport.exe', Cannot find or open the PDB file

即找不到pdb檔案,因此無法除錯。

在visual裡找到pdb相關的配置選項,共2個如下:

configuration property->c/c++->output files->program database file name

這是編譯時產生的pdb檔案的輸出位置,vs在編譯後會將該位置符合$(TargetName).pdb格式的檔案複製到configuration property->general的output directory目錄中(不知道是哪裡的設定起作用),作為執行時debug資訊。不過這一pdb檔案包含的資訊包括型別資訊,但不包括函式定義等符號資訊。因此,即使每個原始檔都包含公共標頭檔案(如 <windows.h>),這些標頭檔案中的 typedef 也只儲存一次,而不是在每個 OBJ 檔案中都存在(見下面的定義)。因此這個pdb檔案是不足以做除錯之用的。

configuration property->linker->debugging->generate program database file

這是連結時連結器產生的pdb檔案的輸出位置,它包含專案的 EXE 檔案的除錯資訊。該 檔案包含完整的除錯資訊(包括函式原型),而不僅僅是在 上一個.PDB 中找到的型別資訊。

這兩個 PDB 檔案都允許增量更新。連結器還在其建立的 .exe 或 .dll 檔案中嵌入 .pdb 檔案的路徑。

對照專案配置,很快發現問題所在。output files->program database file name裡設定的檔名符合$(TargetName).pdb的格式,因此被複制到output directory目錄中,而linker->debugging->generate program database file設定的檔名也剛好是這個位置,因此就沒有被複制進來,所以“鵲巢鳩佔”引起的後果是,包含完整除錯資訊的9mb大的pdb檔案沒有被如約建立,而1mb大的pdb檔案被錯誤的複製倒了不該放的地方,自然.exe檔案就找不到debug資訊了。

以下作為參考:

              VISUAL c+中的pdb檔案及其作用      程式資料庫 (PDB) 檔案儲存著除錯和專案狀態資訊,使用這些資訊可以對程式的除錯配置進行增量連結。當以 /ZI 或 /Zi(用於 C/C++)生成時,將建立一個 PDB 檔案。

     在 Visual C++ 中,/Fd 選項用於命名由編譯器建立的 PDB 檔案。當使用嚮導在 Visual Studio 中建立專案時,/Fd 選項被設定為建立一個名為 project.PDB 的 PDB。



    如果使用生成檔案建立 C/C++ 應用程式,並指定 /ZI 或 /Zi 而不指定 /Fd 時,則最終將生成兩個 PDB 檔案: 

VC80.PDB (更籠統地說就是 VCx0.PDB,其中 x 表示 Visual C++ 的版本。)該檔案儲存各個 OBJ 檔案的所有除錯資訊並與專案生成檔案駐留在同一個目錄中。

project.PDB 該檔案儲存 .exe 檔案的所有除錯資訊。對於本機 C/C++程式碼,它駐留在 /debug 子目錄中。對於託管程式碼,它駐留在 /WINDEBUG 子目錄中。

每當建立 OBJ 檔案時,C/C++ 編譯器都將除錯資訊合併到 VCx0.PDB 中。插入的資訊包括型別資訊,但不包括函式定義等符號資訊。因此,即使每個原始檔都包含公共標頭檔案(如 <windows.h>),這些標頭檔案中的 typedef 也只儲存一次,而不是在每個 OBJ 檔案中都存在。

連結器將建立 project.PDB,它包含專案的 EXE 檔案的除錯資訊。project.PDB 檔案包含完整的除錯資訊(包括函式原型),而不僅僅是在 VCx0.PDB 中找到的型別資訊。這兩個 PDB 檔案都允許增量更新。連結器還在其建立的 .exe 或 .dll 檔案中嵌入 .pdb 檔案的路徑。

Visual Studio 偵錯程式使用 EXE 或 DLL 檔案中的 PDB 路徑查詢 project.PDB 檔案。如果偵錯程式在該位置無法找到 PDB 檔案或者如果路徑無效(例如,如果專案被移動到了另一臺計算機上),偵錯程式將搜尋包含 EXE 的路徑,即在“選項”對話方塊(“除錯”資料夾,“符號”節點)中指定的符號路徑。偵錯程式不會載入與所除錯的二進位制不匹配的 PDB。