vs 生成pdb調試

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。



文章轉自:http://blog.csdn.net/zkzk12345/article/details/6560545
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章