2

很抱歉,如果這個問題已經回答了,但我沒有找到任何相關的。當調試器不正確地擊中斷點時,我在Visual Studio 2013 C++ Win32應用程序中遇到了一個奇怪的問題。這裏是一個示例代碼:錯誤的斷點被擊中

#include "stdafx.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int a = 3; 
    int b = 1; 
    for (int i = 3; i >= 1; i--) 
     if (i % 2) 
      a = a*a; 
    b++; 
    return b; 
} 

我在b++行設置斷點。我在調試c#代碼時非常熟悉調試和斷點(在C++中非常初學者),並且根據我的經驗,b++行的斷點只有在for循環結束時纔會被觸發。但是它會觸發每個循環迭代,但代碼(增量)不會執行。 以下是VS的屏幕截圖,其中包含相關信息 enter image description here

+1

您是否正在運行Release配置?您的一些線路可能會被優化,PDB中的線路號碼不匹配,只是猜測而已。出於這個原因,我們經常使用_Noopt_ builds,它與Release基本相同,但禁用了優化(假設我們不想使用完整的Debug配置)。 – PuerNoctis 2014-11-23 09:31:30

+0

嘗試清理並檢查是否有發佈版本。 – AlexTheo 2014-11-23 09:32:45

+0

1)不,我在調試模式下運行。 2)導致本地人是正確的,但在這一點上不應該擊中斷點。 – Crypt32 2014-11-23 09:35:05

回答

4

其實這段代碼沒問題,應該按照你的預期工作。 VS允許您在執行塊的末尾放置一個斷點(在這種情況下for循環內的if語句)。

enter image description here

由於您沒有包裹if語句與大括號(如上述的圖像中),VS假定您放置在b++語句斷點是指for執行塊的端部,因此休息,而不執行b++聲明。

+0

我是否正確理解如果執行塊(循環,if語句等)沒有大括號,那麼執行後的斷點塊意味着該塊的結束而不是實際的行? – Crypt32 2014-11-23 09:50:27

+1

實際上,它意味着兩者,即程序將停止在這個語句中,因爲它是語句塊的結尾,或者你完成了循環,因此達到了這個語句。 – 2014-11-23 09:59:20

+2

順便說一句,作爲一個經驗法則,我建議你總是使用花括號,即使這些不是必需的。這提高了可讀性,並且還避免了在'for' /'if'語句下面添加其他語句的愚蠢錯誤,並期望它們成爲它們各自的執行塊的一部分。 – 2014-11-23 10:02:01