2013-07-10 71 views
5

if語句中的條件滿足時如何停止調試? 例如:如何在if語句中的條件滿足時調試

if (!check()) { 
    int a = 0; 
} 

int a = 0;是虛擬代碼,然後我在那裏放置一個斷點。 如果我在一個空的if循環中放置一個斷點,調試器將不會停在那裏,它只會停止在它可以執行的指令處。即使你做int a;只是一個聲明 它不會停止。

我可以用其他方式做到這一點,而不是寫虛擬代碼嗎?

謝謝

+7

你的平臺是什麼?大多數調試器應該能夠使用某種條件斷點。 – Bart

+0

「它只停止在它可以執行的指令」,這讓我想知道你是否可以編譯它,以優化它們。 – PlasmaHH

+0

更大的問題是,我想,爲什麼你有一個空的if語句體? –

回答

10

我可以用其他方式來做,而不是寫虛擬代碼嗎?

是的!

在調試器中,您應該能夠添加斷點並將其設置爲僅當滿足特定條件時才中斷。如何做到這一點取決於你的IDE,但在我的代碼編輯器中,或者在單獨的斷點窗口中右鍵單擊斷點,然後從彈出菜單中選擇「屬性」。然後,我得到這個對話框:

Breakpoint properties dialog with Condition set

你可以看到,我已經設置「條件」屬性,這將是每一個代碼命中該斷點時間評估 - 但斷點將只有突破時的條件是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(); 
} 

當你在調試器下運行你的程序時,你會發現該行的執行中斷。

通常沒有什麼理由使用它。我見過的是一個自定義的斷言處理程序,當斷言失敗時會跳入調試程序,但允許之後繼續執行。

0

使用assertion。它用於調試時間錯誤檢查。如果條件爲假(等於零),則立即停止執行。

+0

當條件未滿足時不是嗎? – Dahaka

+0

這裏也是一個很好的例子:http://stackoverflow.com/questions/253212/what-are-assertions-and-why-would-you-use-them – Fuv

+3

OP似乎想要一個_debug break_,而不是'abort這個節目。 –

相關問題