天天看點

vs 調試

本來在之前的“vc6.0編譯c++程式後在vc2008中調試的奇技淫巧(符号資訊和連結)"

http://hi.baidu.com/widebright/blog/item/3262272d34e5002a359bf74d.html?timeStamp=1326769867413

一文裡面有提到的了,但昨天還是忘了第一步的,找了好久。再次給自己強化一下記憶。

使用 debug 模式編譯,不要用release模式。

如果還是不行,或者想在release版本調試,往下看。

====================================

1. 編譯的時候給cl.exe 制定 /ZI 編譯選項

在visual studio 裡面設定選項。

工程屬性 -> C/C++ -> "General" -> Debug Information Format -> Program Database for Edit And Continue

參考

http://msdn.microsoft.com/zh-cn/library/958x11bc(v=vs.100).aspx

/ZI

以支援“編輯并繼續”功能的格式産生如上所述的程式資料庫。 如果想使用“編輯并繼續”調試,則必須使用此選項。 因為大多數優化與“編輯并繼續”不相容,是以使用 /ZI 會禁用代碼中的所有 #pragma optimize 語句。

/ZI 會導緻在編譯中使用 /Gy(啟用函數級連結) 和 /FC(所診斷源代碼檔案的完整路徑)。

/ZI 與 /clr(公共語言運作時編譯) 不相容。

---------------------------------------------------

2. 連結的時候給link.exe 制定編譯選項 /DEBUG 和 /PDB:filename

工程屬性 -》”configuration properties “ -》 “Linker” -》“debugging” -》 “generate program datbase file ”制定了 生成的pdb符号資訊檔案的具體位置。 “Generate Debug Info” 設定為 yes

解釋參考 

http://msdn.microsoft.com/zh-cn/library/xe4t6fc1(v=vs.90).aspx

http://msdn.microsoft.com/zh-cn/library/kwx19e36(v=vs.90).aspx

/DEBUG 選項建立 .exe 檔案或 DLL 的調試資訊。

連結器将調試資訊放在程式資料庫 (PDB) 中。它在後面的程式生成期間更新 PDB。

為調試建立的 .exe 檔案或 DLL 包含相應 PDB 的名稱和路徑。調試器在您調試程式時讀取嵌入的名稱并使用 PDB。連結器使用程式的基名稱和擴充名 .pdb 命名程式資料庫,并嵌入它的建立路徑。若要重寫該預設值,請設定 /PDB 并指定不同的檔案名。

編譯器的僅限行号 (/Zd) 或 C7 相容 (/Z7) 選項使編譯器将調試資訊保留在 .obj 檔案中。還可以使用程式資料庫 (/Zi) 編譯器選項将調試資訊存儲在 .obj 檔案的 PDB 中。連結器首先在寫入 .obj 檔案的絕對路徑中查找對象的 PDB,然後在包含 .obj 檔案的目錄中查找。不能指定對象的 PDB 檔案名或連結器的位置。

指定 /DEBUG 時暗含 /INCREMENTAL。

/DEBUG 将 /OPT 選項的預設值從 REF 更改為 NOREF 以及從 ICF 更改為 NOICF(是以,需要顯式指定 /OPT:REF 或 /OPT:ICF)。

有關 .PDB 和 .DBG 檔案的更多資訊,請參見知識庫文章 Q121366,INFO: PDB and DBG Files - What They Are and How They Work。可以在 MSDN Library 中或 http://support.microsoft.com/default.aspx?ln=zh-cn 上找到知識庫文章。

無法建立包含調試資訊的 .exe 或 .dll。調試資訊始終放在 .pdb 檔案中。

在 Visual Studio 開發環境中設定此連結器選項

打開此項目的“屬性頁”對話框。有關詳細資訊,請參見設定 Visual C++ 項目屬性。

單擊“連結器”檔案夾。

單擊“調試”屬性頁。

修改“生成調試資訊”屬性。

以程式設計方式設定此連結器選項

--------------------------------------------

3.

“attach to process” 或者附加到程序。在“module”視窗裡面找到對應的dll,可以看到pdb符号檔案是不是加載成功。右鍵會有“symbol load informations”  “symbol setting” 兩個選項。

或者中斷後 "call stack"  視窗裡面,右鍵也相應的 dll的函數名 ,會有“symbol load informations”  “symbol setting” 兩個選項

這個也會打開第4步的那個視窗。 

在這個視窗裡面可以手工設定加載自己制定的pdb 符号檔案。

如果發現pdb已經找到,但是還沒法在制定的源碼下斷點,請檢查前面的第一個第二步的設定,特别是這個 /ZI 選項一定要制定,不然在這個視窗裡面看到了pdb已經加載,但卻沒發下斷點,提示沒有符号資訊。另外如果使用的指令行或者makefile的話的link.exe一定要和visual studio的版本對應,vc 2010就用

用vc2010的link.exe.

-----------------------------------------------

4. “tools” -》 “options” -》 “debugging”  -》 “symbol” 那裡可以指定 加載 特定的符号

------------------------------------------

5. 另外vc2008 編輯修改檔案後,沒法下斷點,提示源碼行沒有比對的情況。

重新編譯一下,如果還不解決問題,好像是個bug,選中檔案的所有行,然後利用菜單裡面的  edit ——》advance -》 format selection 把該檔案的所有的代碼都格式化一下。再儲存,重新編譯就可以了。

------------------------------------------

6. MSDN裡面關于pdb檔案的說明

PDB Files (C++)

http://msdn.microsoft.com/en-us/library/yd4f8bd1(v=VS.90).aspx