一.問題及原因
有這樣一種調用邏輯:A.exe調用B.dll.現在想要在B的源代碼中打斷點,從A發起進行調試,卻給出了"當前不會命中斷點.還沒有為該文檔加載任何符號"的提示.感覺十分奇怪,各種重新生成,重啟VS都沒啥用,最后不得以網上搜了一番,找到了問題的根源.
原來我把舊的B.dll文件拷到了A.exe所在的目錄下,導致A.exe調試時直接去調用舊的B.dll文件,而舊的dll文件對應的.pdb文件早已經不存在了,因此無法進行調試.(.pdb文件中存儲著調試信息.dll文件源代碼修改后,重新生成就生成了新的.pdb,和舊的dll文件不再匹配.)
?
?
(以下是參考資料)?
二..pdb的更多介紹
在 Windows 系統中,符號文件以 .pdb 為擴展名.每個模塊被載入的時候(EXE和DLL都可以稱之為模塊),其相同名字的PDB文件同時被載入。所以Debug模式下,不僅因為代碼沒有優化,同時因為要載入PDB文件,所以Debug模式下的程序執行速度非常慢。
每個模塊只會生成一個相同名字的PDB文件,并且模塊生成的同時,會校驗PDB文件生成GUID記錄在模塊內。這是因為調試時,調試器強制要求每個模塊必須和PDB文件保持一致。實驗過程中,用之前生成的PDB文件替換當前生成的PDB文件時,Debug窗口會顯示No symbols loaded.?MSDN也做了相應的說明:The debugger will load only a PDB for a binary that exactly matches the PDB that was created when the binary was built.
PDB文件中記錄了源文件路徑的相關信息,所以在載入PDB文件的時候,就可以將相關調試信息與源碼對應。這樣可以可視化的實時查看調試時的函數調用、變量值等相關信息。模塊當中記錄的PDB文件是絕對路徑。所以只要模塊在當前電腦上載入,調試器自然地會根據模塊當中的路徑信息找到相應PDB文件并載入。同樣PDB文件中記錄的源文件路徑也是絕對路徑,所以PDB文件只要在當前電腦上載入,調試進入相應模塊時,都能夠匹配到記錄的源文件,然后可視化地查看相應信息。
如果源文件找不到,那么依然能夠查看調試信息,只是這個時候只能查看匯編代碼,不能通過源文件可視化查看信息。一般情況下,絕大多數C++程序員不具備閱讀匯編代碼的能力。所以完全通過PDB文件調試,意義與作用均沒有多大。如果要讓其他人能夠調試自已的代碼,PDB文件和源碼都應該提供,只提供PDB文件的意義不大。如果確實有類似的需求,可以保留相應生成的PDB文件。微軟的很多庫默認是不提供PDB文件的,但是近來微軟逐漸開放了一些庫的PDB文件。
三.利用.pdb調試dll
1. 寫一個調用Dll中函數的控制臺測試程序test。
2. 設置test,將debug下編譯連接生成dll和lib復制到.exe所在路徑,使得test能夠運行起來。
3. 將與dll一同產生的debug文件夾下的pdb文件復制到sln所在路徑下,運行調試test,F11就能夠進入所調用的dll中的函數。
?
參考資料:
1.https://blog.csdn.net/wqfhenanxc/article/details/80674223
2.https://blog.csdn.net/u011595231/article/details/17244109