一.問題及緣由程序員
有這樣一種調用邏輯:A.exe調用B.dll.如今想要在B的源代碼中打斷點,從A發起進行調試,卻給出了"當前不會命中斷點.尚未爲該文檔加載任何符號"的提示.感受十分奇怪,各類從新生成,重啓VS都沒啥用,最後不得以網上搜了一番,找到了問題的根源.函數
原來我把舊的B.dll文件拷到了A.exe所在的目錄下,致使A.exe調試時直接去調用舊的B.dll文件,而舊的dll文件對應的.pdb文件早已經不存在了,所以沒法進行調試.(.pdb文件中存儲着調試信息.dll文件源代碼修改後,從新生成就生成了新的.pdb,和舊的dll文件再也不匹配.)測試
(如下是參考資料) 優化
二..pdb的更多介紹ui
在 Windows 系統中,符號文件以 .pdb 爲擴展名.每一個模塊被載入的時候(EXE和DLL均可以稱之爲模塊),其相同名字的PDB文件同時被載入。因此Debug模式下,不只由於代碼沒有優化,同時由於要載入PDB文件,因此Debug模式下的程序執行速度很是慢。spa
每一個模塊只會生成一個相同名字的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..net
PDB文件中記錄了源文件路徑的相關信息,因此在載入PDB文件的時候,就能夠將相關調試信息與源碼對應。這樣能夠可視化的實時查看調試時的函數調用、變量值等相關信息。模塊當中記錄的PDB文件是絕對路徑。因此只要模塊在當前電腦上載入,調試器天然地會根據模塊當中的路徑信息找到相應PDB文件並載入。一樣PDB文件中記錄的源文件路徑也是絕對路徑,因此PDB文件只要在當前電腦上載入,調試進入相應模塊時,都可以匹配到記錄的源文件,而後可視化地查看相應信息。debug
若是源文件找不到,那麼依然可以查看調試信息,只是這個時候只能查看彙編代碼,不能經過源文件可視化查看信息。通常狀況下,絕大多數C++程序員不具有閱讀彙編代碼的能力。因此徹底經過PDB文件調試,意義與做用均沒有多大。若是要讓其餘人可以調試自已的代碼,PDB文件和源碼都應該提供,只提供PDB文件的意義不大。若是確實有相似的需求,能夠保留相應生成的PDB文件。微軟的不少庫默認是不提供PDB文件的,可是近來微軟逐漸開放了一些庫的PDB文件。調試
三.利用.pdb調試dllblog
1. 寫一個調用Dll中函數的控制檯測試程序test。
2. 設置test,將debug下編譯鏈接生成dll和lib複製到.exe所在路徑,使得test可以運行起來。
3. 將與dll一同產生的debug文件夾下的pdb文件複製到sln所在路徑下,運行調試test,F11就可以進入所調用的dll中的函數。
四.其餘可能的緣由:
1.沒有附加到正確的進程
2.
參考資料:
1.https://blog.csdn.net/wqfhenanxc/article/details/80674223
2.https://blog.csdn.net/u011595231/article/details/17244109