if語句中的條件滿足時如何停止調試? 例如:如何在if語句中的條件滿足時調試
if (!check()) {
int a = 0;
}
int a = 0;是虛擬代碼,然後我在那裏放置一個斷點。 如果我在一個空的if循環中放置一個斷點,調試器將不會停在那裏,它只會停止在它可以執行的指令處。即使你做int a;只是一個聲明 它不會停止。
我可以用其他方式做到這一點,而不是寫虛擬代碼嗎?
謝謝
if語句中的條件滿足時如何停止調試? 例如:如何在if語句中的條件滿足時調試
if (!check()) {
int a = 0;
}
int a = 0;是虛擬代碼,然後我在那裏放置一個斷點。 如果我在一個空的if循環中放置一個斷點,調試器將不會停在那裏,它只會停止在它可以執行的指令處。即使你做int a;只是一個聲明 它不會停止。
我可以用其他方式做到這一點,而不是寫虛擬代碼嗎?
謝謝
我可以用其他方式來做,而不是寫虛擬代碼嗎?
是的!
在調試器中,您應該能夠添加斷點並將其設置爲僅當滿足特定條件時才中斷。如何做到這一點取決於你的IDE,但在我的代碼編輯器中,或者在單獨的斷點窗口中右鍵單擊斷點,然後從彈出菜單中選擇「屬性」。然後,我得到這個對話框:
你可以看到,我已經設置「條件」屬性,這將是每一個代碼命中該斷點時間評估 - 但斷點將只有突破時的條件是true
。即,如果check()
返回true
當一切正常時,!check()
將使其中斷check()
返回false
。
如果這個方法被稱爲很多,這往往會減慢你的程序的速度,因爲通常要評估這樣一個表達式,調試器必須(內部)打破和評估某些東西。但它功能齊全。注意:你可以設置以及其他屬性,而這還沒有得到該對話框的樣子單擊高級按鈕後...
爲了回答您的其他問題:
如果我把一個在一個空的if循環中的斷點,調試器不會在那裏停止 ,它只停止在它可以執行的指令處。即使你做 int a;只是一個聲明,它不會停止。
如果if塊(非循環)爲空,那麼它就沒有什麼可以停下來的。它只能停在實際的代碼上。 int a;
只是一個變量聲明;對於簡單的類型,實際上沒有爲此生成代碼。 (它可以是更復雜的類型,不過,MyClass a;
例如,因爲這將調用構造函數)。即使你寫多一點代碼:
if (!check()) {
int a;
a = 5;
b = a;
}
你的編譯器可能還沒有產生,因爲這方面的任何代碼它可能會發現代碼從來沒有做任何事情。這在一定程度上取決於您的優化設置,但是一些編譯器會優化它,即使沒有任何特定的優化設置。
有時,由於各種原因(有時候只是條件評估的速度),代碼可能很容易被打破,而不是使用IDE。在這種情況下,我傾向於使用函數調用來打破,因爲編譯器不知道該函數不修改程序的狀態,無法優化它扔掉:
if (!check()) {
rand(); // <- breakpoint here
}
但通常情況下用好你的IDE和調試器功能是一個更好的辦法。
編輯:因爲這是upvoted(感謝球員)我想我會添加另一種方法,爲完整性。 interrupt 3, which is patched in by the debugger.彙編指令只有一個字節長,因此可以通過任何其他指令進行修補;當程序中斷時,舊的指令可以臨時修補。但是和調試器一樣,你可以把它放在代碼中。
換句話說,你可以強制你的程序代碼打破(和調試器被抓;通常情況下,你的程序將中止;如果你不是在調試器下運行,這可能會導致問題)通過這樣的事情。語法取決於您的環境:
if (!check()) {
__asm int 3
}
甚至更好,避免環境相關的代碼,許多C++編譯器有內部函數或宏,如DebugBreak();
或__debugbreak
您可以使用這樣的:
if (!check()) {
DebugBreak();
}
當你在調試器下運行你的程序時,你會發現該行的執行中斷。
通常沒有什麼理由使用它。我見過的是一個自定義的斷言處理程序,當斷言失敗時會跳入調試程序,但允許之後繼續執行。
你的平臺是什麼?大多數調試器應該能夠使用某種條件斷點。 – Bart
「它只停止在它可以執行的指令」,這讓我想知道你是否可以編譯它,以優化它們。 – PlasmaHH
更大的問題是,我想,爲什麼你有一個空的if語句體? –