2010-05-05 48 views
5

這太瘋狂了。它開始發生在我的主要項目中,所以我創建了一個小樣本全新項目來重現它。當然,它不會發生在我創建的示例項目中,它只是一個Win32控制檯應用程序。VS2008 C++ MFC訪問衝突只有當通過調試模式步進

我在Win7x64上運行這個,如果有的話。 VS2008 SP1。

在這裏。我用一個按鈕創建一個小對話框應用程序。在該按鈕的處理函數中放置一個斷點。按鈕處理函數如下所示:

void CTestProjectDlg::OnBnClickedButton1() 
{ 
    int i; 

    i = 2; // < breakpoint here 
    i = 3; 

} 

單擊該按鈕,命中斷點。 F10步驟,並繁榮:「TestProject.exe中的0x0398f77b第一次機會異常:0xC0000005:訪問衝突。」

它給了我選擇打破或繼續。如果我繼續,它只是再次點擊它,而不是「第一次機會」。是的,我在Debug-> Exceptions dlg中檢查了這個異常。

如果我休息,調用堆棧只顯示斷點所在的行。如果我F10 再次 ..我再次得到異常,只有現在的callstack在_AfxDispatchCmdMsg()函數中顯示我,並且我原來的OnBnClickedButton1()不在調用堆棧中了。

無論我放置斷點的位置如何。

如果不是F10,我只是繼續使用F5,它可以正常工作。

現在..如果我構建一個發佈版本並運行在調試模式下:我打斷點,所有的指針,變量值看起來很正常。 F10,這些轉向垃圾。這個指針現在爲零。 m_csHello現在是

但是,在發佈模式下,沒有捕獲到異常,並且它一切正常。 「hello World string在對話框中顯示,因爲它應該。

我已經提出了一個查詢,看看我的盒子裏是否有IT補丁在最後一兩天安裝了一些補丁。 ?發生4天前

你認爲什麼是VS2008損壞

感謝

編輯:。其他信息如果我建立/調試x64平臺僅適用於Win32這不會發生。
我還查看了VS2008的所有修補程序/安全更新。是

最後,我把這個項目在不同的機器尚未更新,在過去2-3週上。它可以在那裏找到,並且安裝了相同的VS更新。

爲了本文的目的,我也改變了正在被越過的代碼。 ..這是一個簡單的整數賦值,不涉及MFC。

此刻我正在重新安裝VS2008。

+0

你鏈接的控制(比如IDC_BUTTON1)爲ON_BN_CLICKED(IDC2_BUTTON1,OnBnClcikedCutton1)?這可能是一個問題。 – Sunscreen 2010-05-06 08:25:00

+0

是的。如果我理解你的問題,那就是它如何到達斷點。 – HotOil 2010-05-06 11:56:57

+0

在你的代碼,你必須控制你的鏈接對話框的rlated功能的遊戲內某處: BEGIN_MESSAGE_MAP(CTestProjectDlg,CDialog的) ... ON_BN_CLICKED(IDC2_BUTTON1,OnBnClcikedCutton1) 你可以搜索你的cpp代碼爲「ON_BN_CLICKED」?它在嗎? – Sunscreen 2010-05-06 14:44:32

回答

1

你說相同的項目編譯和運行在與Visual Studio相同版本的不同機器上很好。代碼看起來很好,所以是的,這聽起來像VS 2008已損壞,需要重新安裝。

+0

謝謝你確認我的懷疑。 在名稱中卸載了所有帶有VS2008的東西。然後重新安裝。 問題消失了。現在重新安裝SP1。 希望我知道是什麼引起的。還沒有這臺電腦2個星期了。我擔心IT團隊可能會爲我解決這個問題。不知道到底要避免什麼,以防止它再次發生.. – HotOil 2010-05-06 18:16:50

0

如果它在Release但不能調試,那麼我想你有一個未初始化的變量。在調試時,它會自動設置爲0xcdcdcdcd(或其中的一個子部分,取決於變量的大小),這會導致您在發佈失敗時擁有內存中的任何值,也許該值會阻止它破壞...很多時候,未初始化像這樣的變量用作循環綁定,並且在調試時通過內存寫入並覆蓋可能導致失敗的重要事項。在發佈中,價值恰好是可以的,但並不總是如此。

至於你在調試中的發佈,不要擔心這個值看起來像是空的。它很可能不是,但調試器很難通過優化過程確切地知道您在代碼中的位置。

+0

可能是這樣的情況..但*我*沒有變數!這是一個由VS2008生成的單功能對話框應用程序。我添加的唯一的東西是按鈕處理程序。僅在跨越下一行代碼時發生錯誤。不這樣做,不會產生異常。 – HotOil 2010-05-06 11:56:14

0

聰明的事情是(反直覺地)查找所有斷點等。重建您的項目(不是增量構建)。重要的是從一個乾淨的石板開始,抓住異常,並獲得一個乾淨的調用堆棧,並確保構建源文件的準確性。您還應該禁用預編譯頭文件等。

1

我也遇到過同樣的事情,再次在Win7x64,VS2008 SP1開發平臺上。我的代碼是C++,WTL,ATL,DirectShow和其他各種庫。

Windows更新日誌顯示午餐時間我的機器上出現了Windows更新。問題只發生在午餐後 - 沒有項目變更!

該死的你和你的愚蠢的自動更新,打破發展環境m $!恥辱你們都!

6

與VS2008 SP1,Win7x64,32bit調試代碼有同樣的問題。如果我關閉選項

工具 - >選項 - >調試 - >本機 - >啓用RPC調試,問題消失。

以下項可能與此有關: Debugging commands (step over/into) cause unhandled exceptions

+0

我剛剛得到一臺新的機器,x64,並從一個古老的,粗糙的代碼從幾年前提交給我的一個討厭的bug,我修復了一些錯誤在一年前。編譯它,看到可怕的異常,我認爲它們與bug有關。花了整整一天的時間才意識到,不,它只發生在我試圖調試的時候,只有當我在某處放置了斷點時。你的修復工作完美:我的理智恢復了! (我仍然有該錯誤修復,但我只是很高興它不是在隨機的地方訪問衝突,應該不會拋出訪問衝突......) – neminem 2012-02-13 22:12:48

+1

謝謝你的回答,我剛剛遇到了這個問題和搜索這裏,這立即修復它(使用Visual Studio 2010)。 – 2012-02-16 13:30:47

+0

我認爲這是答案;現在它已經爲5臺機器解決了我的問題。這可以解釋爲什麼重新安裝也起作用 - 該選項默認情況下不會啓用。 – thomasmichaelwallace 2013-10-24 10:17:33