2014-12-06 102 views
0

我有一個簡單的C++程序;如何在不使用調試器的情況下跟蹤C++的執行情況?

int someFunction() 
{ 
    cout << "Testing here" << endl; 
    cout << "reached here in function " << __LINE__ << " in " << __FUNCTION__ << endl; // debug purposes 

    // do some more stuffs here 

    cout << "reached here in function " << __LINE__ << " in " << __FUNCTION__ << endl; // debug purpsoes 
} 

有沒有辦法打開/關閉標記爲「調試目的」的代碼行?這些想法是在遇到問題的時候,我可以寫一行代碼來切換這些類型的調試目的代碼,並在解決問題時將其關閉。

我知道調試器是爲了這個目的,但想要簡單的程序很簡單。

+1

曾聽說過[條件定義](http://msdn.microsoft.com/en-us/library/ew2hz0yd.aspx)? – 2014-12-06 16:31:05

回答

3

你可以用它在有條件的定義:

#ifndef NDEBUG 
    // Debugcode here 
#endif 

當您完成調試,編譯時只需定義NDEBUG。您可能還想看看assert.它由同一個宏NDEBUG控制,並且可以輕鬆讓您檢查您的程序中的條件。您也可以讓它產生有意義的錯誤消息:

assert(allWentWell && "Blah went wrong!"); 

assert的錯誤消息還將包含錯誤發生位置的信息。

0

是要「開/關」的一些代碼的一部分,你可以使用宏和預處理指令的#ifdef和#endif:

#ifdef _DEBUG 
//run this code 
#endif 

上面的代碼將只運行,如果_DEBUG宏定義:

#define _DEBUG 
+2

'_DEBUG'是實現保留標識符,不能用於用戶代碼。 – 2014-12-06 16:44:26

3

除了對方回覆,你可以聲明全局標誌:

#ifndef NDEBUG 
bool want_debug; 
#endif /*NDEBUG*/ 

再定義一個宏

#ifndef NDEBUG 
#define DEBUG_OUT(Expr) do {if (want_debug) \ 
    cout << __FILE__ << ":" << __LINE__ << " " \ 
     << Expr << endl;} while(0) 
#else 
#define DEBUG_Out(Expr) do{}while(0) 
#endif 

,你會添加大量的報表一樣

DEBUG_OUT("here x="<< x); 

want_debug標誌可以在運行時設置(例如在調試器內部,或者由您的main處理的一些-d程序參數)。如果使用-DNDEBUG進行編譯,則不會得到DEBUG_OUT語句的任何代碼。

我正在使用與舊assert(3)相關的NDEBUG預處理器符號。

當然,小心避免DEBUG_OUT中的有意義的副作用,例如,
DEBUG_OUT("here y=" << y++); /*WRONG side effect*/肯定是一個錯誤。

如果使用的是最新GCC編譯器(例如,g++ 4.9版本),你也可以自定義使用MELT加入神奇(在你的定製擴展熔體編碼)的一些通行卡,將自動添加的日誌信息(例如,在每個月底常規)。但這可能意味着數週的工作(對於現有的大型軟件項目來說這是值得的)。

+0

@Baile Starynkevitch,相當有啓發性,謝謝。 – Amani 2014-12-06 18:16:11

3

解決這個問題的經典方法是定義一些記錄宏;一個簡單的例子可能是:

#ifdef_NDEBUG 
# define LOG(X) 
#else 
# define LOG(X) do { std::clog<<__FILE__<<":"<<__LINE__<<" "<<(X)<<std::endl;} while(0) 
#endif 

用法:

LOG("Before frobbing the widget (i="<<i<<")"); 

當然,這可以採取任何複雜(有一些接近採伐問題相當多的庫)。

+0

看起來很像我的答案。 – 2014-12-06 16:44:30

+0

@BasileStarynkevitch:我注意到了,因爲它更完整,所以我贊成你的。 – 2014-12-06 17:02:05