如何在不使用调试器的情况下跟踪C++的执行情况?

问题描述:

我有一个简单的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

你可以用它在有条件的定义:

#ifndef NDEBUG 
    // Debugcode here 
#endif 

当您完成调试,编译时只需定义NDEBUG。您可能还想看看assert.它由同一个宏NDEBUG控制,并且可以轻松让您检查您的程序中的条件。您也可以让它产生有意义的错误消息:

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

assert的错误消息还将包含错误发生位置的信息。

是要“开/关”的一些代码的一部分,你可以使用宏和预处理指令的#ifdef和#endif:

#ifdef _DEBUG 
//run this code 
#endif 

上面的代码将只运行,如果_DEBUG宏定义:

#define _DEBUG 
+2

'_DEBUG'是实现保留标识符,不能用于用户代码。 – 2014-12-06 16:44:26

除了对方回复,你可以声明全局标志:

#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

解决这个问题的经典方法是定义一些记录宏;一个简单的例子可能是:

#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