如何在不使用调试器的情况下跟踪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
}
有没有办法打开/关闭标记为“调试目的”的代码行?这些想法是在遇到问题的时候,我可以写一行代码来切换这些类型的调试目的代码,并在解决问题时将其关闭。
我知道调试器是为了这个目的,但想要简单的程序很简单。
你可以用它在有条件的定义:
#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
'_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加入神奇(在你的定制扩展熔体编码)的一些通行卡,将自动添加的日志信息(例如,在每个月底常规)。但这可能意味着数周的工作(对于现有的大型软件项目来说这是值得的)。
@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<<")");
当然,这可以采取任何复杂(有一些接近采伐问题相当多的库)。
看起来很像我的答案。 – 2014-12-06 16:44:30
@BasileStarynkevitch:我注意到了,因为它更完整,所以我赞成你的。 – 2014-12-06 17:02:05
曾听说过[条件定义](http://msdn.microsoft.com/en-us/library/ew2hz0yd.aspx)? – 2014-12-06 16:31:05