以前也碰到過同樣的問題,但沒有問個為什麼,也沒有探個究竟。昨天調試一個DLL,添加輸出資訊吧,太麻煩而且不容易定位,但設定斷點後按“F5”,斷點不可用,氣泡提示“當前不會命中斷點,還沒有為該文檔載入任何符號。”再右鍵->“位置”->“允許原始碼與原始版本不同”,還是不行。77777我還不信了,整它!
後來才發現,“Alt+F7”->“配置屬性”->“調試”->“命令”中輸入的 exe 路徑下,已經提供了此 DLL,壓根就沒有調用咱 F5 啟動的DLL。。。。。。把 exe (以及相關的其它檔案,如果有)拷貝到 DLL 目錄下,就可以調試了。
犯了個低級錯誤。但也總結了一下不能調試的各種可能原因:
1.解決方案配置是 Debug ,但沒有在工程屬性頁面中“Alt+F7”->“配置屬性”->“C/C++”->“常規”->“調試資訊格式”,選擇“用於“編輯並繼續”的程式資料庫(/ZI)”。另外,在“配置屬性”->“連結器”->“調試”->“產生調試資訊”中,選擇“是”。
2.解決方案配置是 release ,直接F5調試就可以,VS會提示你“沒有找到調試資訊,要繼續調試嗎?”,選擇“是”即可。
3.檢查工程所在路徑是不是有中文,有VS不支援中文路徑的可能(參照http://blog.csdn.net/red_hope/archive/2007/10/20/1833916.aspx的經驗)。
4.刪掉.ncb和.opt,rebuild all。
5.看是否有:“warning C4819: 該檔案包含不能在當前字碼頁(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失”警告,把那個cpp檔案用記事本開啟,另存新檔unicode格式,再重新編譯。(參照http://www.cppblog.com/qiujian5628/archive/2008/04/11/41806.html vs2005奇怪的斷點無效問題 )
6.工具->選項->調試->常規,將”要求源檔案與原始版本完全符合”的勾取消就可以了!
呵呵,暫時就這些了,歡迎朋友們補充:)
這是在cppblog看到的另一遍文章:
最近一工程中,在調試的時候,有些cpp檔案都可以設定斷點並且跟進去,但是有一個cpp檔案總是不能設定斷點,提示“當前不會命中斷點。原始碼與原始版本不同。” 重新更換過n次檔案都不起作用,然後在goole搜尋此類類似問題,找到下篇文章,然後我把那個cpp檔案用記事本開啟,另存新檔unicode格式,再重新編譯,最後問題解決!也可以更改vs2005的設定,選項->常規,將要求源檔案與原始版本完全符合的勾取消就可以了!
清理整個解決方案,重新編譯,無效。刪除整個目錄,從SubVersion伺服器上Down下來重新來過,一樣無效。上網搜尋,未果。鬱悶地放手了。
修一個Bug,提交,然後更新了一下,編譯,運行,發現我也染上這個癥狀了——只有那個檔案無法插入斷點。倒有些安心了,看來不是VC的Bug,而是原始碼的問題。把這個檔案復原到更新前的版本,果然就沒問題了。更新到下一個版本,問題就出來了。查看改動,沒瞧出來什麼。忽然發現有一個不常見的警告:“warning C4819: 該檔案包含不能在當前字碼頁(936)中表示的字元。請將該檔案儲存為 Unicode 格式以防止資料丟失”。呵呵,應該就是它了。
警告有兩個,一個是檔案的,不帶行號,另一個帶行號。那一行是一個case語句,最後加了一句中文注釋。把注釋刪掉,問題解決。把代碼拷貝到UltraEdit中看十六進位代碼,逐個位元組濾過去,沒發現什麼奇怪的。然後開始逐步逼近問題,把注釋前後漢字逐個拿掉,直到問題消失,最後剩下來的核心詞是“立即訊息”,搜尋這個詞,果然在整個項目裡只有一個。在這個詞前面增、刪一個空格,問題就消失。鬱悶的是把同一行代碼拷貝到其他檔案、位置都不會有這個問題。
恢複所有改動,更新到最新版本,問題又變了:警告只剩下一個,沒了行號!用插入空格的方法定位問題,發現錯誤向前移動了幾行。而且這次就算把警告消掉,還是無法添加斷點。嘗試了好一會兒沒有效果,乾脆用VC直接把整個檔案格式化了一次,斷點又可以用了。而且,這次再怎麼插入空格都不會有C4819了。對比了一下修改前後的檔案,依然沒有什麼發現。
搜尋了一下,其他人也遇到過C4819,有的是因為Unix換行格式,甚至boost庫中一個非ASCII作者名都會引發這個錯誤,但是這裡應該是中文雙位元組字元錯位的問題吧。因為警告層級開到了4,所以各種警告有些泛濫,他們又沒有及時處理,這個警告就被淹沒在警告堆裡了……
另也有:
我也遇到過相同的問題,也是斷點無法跟進。解決方案是在斷點之前加上MessageBox就可以了,原理未知
或者在call stack中右鍵設定調用斷點位置,詳見:如何:編輯斷點位置