vs2005奇怪的斷點(diǎn)無(wú)效問(wèn)題
最近一工程中,在調(diào)試的時(shí)候,有些cpp文件都可以設(shè)置斷點(diǎn)并且跟進(jìn)去,但是有一個(gè)cpp文件總是不能設(shè)置斷點(diǎn),提示“當(dāng)前不會(huì)命中斷點(diǎn)。源代碼與原始版本不同。” 重新更換過(guò)n次文件都不起作用,然后在goole搜索此類(lèi)類(lèi)似問(wèn)題,找到下篇文章,然后我把那個(gè)cpp文件用記事本打開(kāi),另存為unicode格式,再重新編譯,最后問(wèn)題解決!也可以更改vs2005的設(shè)置,選項(xiàng)->常規(guī),將要求源文件與原始版本完全匹配的勾取消就可以了!
清理整個(gè)解決方案,重新編譯,無(wú)效。刪除整個(gè)目錄,從SubVersion服務(wù)器上Down下來(lái)重新來(lái)過(guò),一樣無(wú)效。上網(wǎng)搜索,未果。郁悶地放手了。
修一個(gè)Bug,提交,然后更新了一下,編譯,運(yùn)行,發(fā)現(xiàn)我也染上這個(gè)癥狀了——只有那個(gè)文件無(wú)法插入斷點(diǎn)。倒有些安心了,看來(lái)不是VC的Bug,而是源代碼的問(wèn)題。把這個(gè)文件回滾到更新前的版本,果然就沒(méi)問(wèn)題了。更新到下一個(gè)版本,問(wèn)題就出來(lái)了。查看改動(dòng),沒(méi)瞧出來(lái)什么。忽然發(fā)現(xiàn)有一個(gè)不常見(jiàn)的警告:“warning C4819: 該文件包含不能在當(dāng)前代碼頁(yè)(936)中表示的字符。請(qǐng)將該文件保存為 Unicode 格式以防止數(shù)據(jù)丟失”。呵呵,應(yīng)該就是它了。
警告有兩個(gè),一個(gè)是文件的,不帶行號(hào),另一個(gè)帶行號(hào)。那一行是一個(gè)case語(yǔ)句,最后加了一句中文注釋。把注釋刪掉,問(wèn)題解決。把代碼拷貝到UltraEdit中看十六進(jìn)制代碼,逐個(gè)字節(jié)濾過(guò)去,沒(méi)發(fā)現(xiàn)什么奇怪的。然后開(kāi)始逐步逼近問(wèn)題,把注釋前后漢字逐個(gè)拿掉,直到問(wèn)題消失,最后剩下來(lái)的核心詞是“即時(shí)消息”,搜索這個(gè)詞,果然在整個(gè)項(xiàng)目里只有一個(gè)。在這個(gè)詞前面增、刪一個(gè)空格,問(wèn)題就消失。郁悶的是把同一行代碼拷貝到其他文件、位置都不會(huì)有這個(gè)問(wèn)題。
恢復(fù)所有改動(dòng),更新到最新版本,問(wèn)題又變了:警告只剩下一個(gè),沒(méi)了行號(hào)!用插入空格的方法定位問(wèn)題,發(fā)現(xiàn)錯(cuò)誤向前移動(dòng)了幾行。而且這次就算把警告消掉,還是無(wú)法添加斷點(diǎn)。嘗試了好一會(huì)兒沒(méi)有效果,干脆用VC直接把整個(gè)文件格式化了一次,斷點(diǎn)又可以用了。而且,這次再怎么插入空格都不會(huì)有C4819了。對(duì)比了一下修改前后的文件,依然沒(méi)有什么發(fā)現(xiàn)。
搜索了一下,其他人也遇到過(guò)C4819,有的是因?yàn)閁nix換行格式,甚至boost庫(kù)中一個(gè)非ASCII作者名都會(huì)引發(fā)這個(gè)錯(cuò)誤,但是這里應(yīng)該是中文雙字節(jié)字符錯(cuò)位的問(wèn)題吧。因?yàn)榫娴燃?jí)開(kāi)到了4,所以各種警告有些泛濫,他們又沒(méi)有及時(shí)處理,這個(gè)警告就被淹沒(méi)在警告堆里了……
posted on 2008-01-24 14:33 浪跡天涯 閱讀(20096) 評(píng)論(15) 編輯 收藏 引用 所屬分類(lèi): C++