本來在之前的“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