今天寫**遇到了乙個非常詭異的問題,讓我想把這個問題記下來。
我們寫**時可能會遇到斷點不執行,執行不正常等等情況,這裡就簡單分析一下常見的幾種情況。
首先從我遇到的問題開始說起吧。
今天斷點除錯的時候發現乙個地方的邏輯沒有執行就直接跳出去了,好像那個位置有乙個return語句一樣。
實際情形如下:
第一行的位置打了乙個斷點,我在除錯的時候nmode的值為7,max_camera是列舉型別值為8。按理來說,這段**下一步應該跳到nmode ==7那一行,也就是第10行,它確實是跳到那一行。不過很神奇的是,再執行下一句的時候,它直接跳到了最後一行,也就是他並沒有執行後面的兩個else判斷。這怎麼看都是奇怪的?我確實看到斷點斷到了10行,那說明他沒有執行到7,8行的邏輯(事實證明這個結論就是錯的)。他應該執行nmode
==7才對,就算不執行也應該進入第三個else。
自己解決不了就求朋友幫忙,雖然他也覺得怪異,但是讓我在第8行加乙個return語句。然後我就神奇的發現,斷點竟然進入到了新加的return那裡。這裡我突然意識到乙個問題,如果在兩個{}裡面什麼也不寫,斷點是不會打到這裡的,所以就會跳到10行,看起來好像並沒有進入第乙個判斷,但是其實可能已經進去了。
雖然這個問題理解了,但是為什麼nmode>= max_camera這句話是成立的7>=8麼?一般人可能認為是我**寫錯了,但是我重新建立乙個工程發現這句話邏輯是不成了立的,如果哪位高人能解決這個問題不勝感激,編譯器抽風了?
void game::setmode(int nmode)
else if (nmode == 7)
else
}}
由上總結的乙個結論就是,不要在{}裡面什麼什麼也不寫,這樣除錯的時候可能會出現一些看起來比較奇怪的情況,而且這樣的寫法很不合適。
其實,解決這個問題前我猜測了幾種情況,對應的解決方法如下。
1.這個地方是不是打不到斷點?如果打不到斷點,是乙個空心的圓圈,可能是專案被優化。可以右鍵專案——屬性——配置屬性——c/c++——優化,看裡面是不是完全優化或者其他優化,是的話可以把優化禁用。
2.是不是除錯符號檔案與當前的工程檔案對不上,那可以把對應生成的pdb檔案刪除再重新生成一下。
3.工程的生成配置是debug,profile還是release模式。一般情況下release模式下很多內容都是被優化掉的,不能正常除錯,切換模式。
VS2003中DLL斷點除錯,不執行斷點
問題描述 最近在vs2003中除錯乙個mfc程式,這個mfc程式中呼叫了乙個dll動態鏈結庫。想除錯dll中的原始碼,在dll中設定斷點,然後執行,選擇外部exe檔案執行,結果dll中的斷點全變成了問號,且執行不到。問題分析 ncb檔案的問題。ncb是 no compile browser 的縮寫,...
VS 除錯斷點命中
在使用vs開發時,有時斷點會無法進入,特別是在乙個專案中引用另乙個類庫專案時。如下圖。我在乙個專案中引用了自定義的控制項mycontrol類庫,但在使用時發現,有些地方還需要調整,比如這裡我需要增加乙個guid作為特殊標識,並輸出以供測試。但是當我將這段 加入進去後,按f5執行程式時,這段 的斷點沒...
vs除錯無法進入斷點
有時候,我們在用vs除錯的時候,會出現斷點無效。如下圖 第一反應,要看想一下是不是在debug下。如果在release下,請參考我另篇文章 怎麼在release下除錯 如果是在debug下 1.檢查工程配置是否設定正確。c general debug information format progr...