上次文章里谈了接口和bug问题。 继续谈谈我对这个浅薄的认识。这里继续谈一下技巧(示例工程ftp://vckpub:vckbase@218.75.9.231/CarrotRemindVS.rar)。assert TRACE 在开发中起到重要的作用。 但是似乎还是不够的。 我们需要更好的debug工具。 开发中, 错误是无法预知的。 那么我们需要知道跟踪程序运行时刻的流程, 而不是你去猜想程序到底怎么运行, 这样是十分低效的。我们需要开发一个debug工具, 来记录每次运行时的情况, 一看记录文件, 错误就一目了然。 比如类的构造和析构函数加上debug日志, 记录类的new和delete. 又如记录函数的返回值,很快能发现, 那个函数调用失败了等等。
如何开发一个debug的工具。 我这里给出一组以宏的形式出现的接口。具体实现上就怎么方便怎么写了。 程序是定时提醒。 有兴趣可以到下载。
下面是debug日志文件内容
DEBUG: CSS_RemindManager::GetInstance [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::GetInstance: new mInstance [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::CSS_RemindManager [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::AddRemind [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::AddRemind: create a DoRemind [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::CreateDoRemind(...) [110-1-25 9:12:10]
DEBUG: CSS_DoRemind::CSS_DoRemind [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::CreateId [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::AddRemind: get a id=0 [110-1-25 9:12:10]
DEBUG: CSS_RemindManager::AddRemind [110-1-25 9:12:10]
接口
#define CSS_ASSERT(X) /
do { /
assert X; /
}while(0)
#ifdef CSS_NLOGGING
#define CSS_RETURN(Y) do{ return (Y); }while(0)
#define CSS_DEBUG(X) do{}while(0)
#define CSS_ERROR(X) do{}while(0)
#define CSS_ERROR_RETURN(X, Y) do{ return (Y); }while(0)
#else
#define CSS_RETURN(Y) /
do { /
return (Y); /
}while(0)
#define CSS_DEBUG(X) /
do { /
CSS_Logger::GetInstance()->WriteDebugLogger X; /
}while(0)
#define CSS_ERROR(X) /
do { /
CSS_Logger::GetInstance()->WriteErrorLogger X; /
}while(0)
#define CSS_ERROR_RETURN(X, Y) /
do { /
CSS_Logger::GetInstance()->WriteErrorLogger X; /
return (Y); /
}while(0)
#endif
class CSS_UTILITY_EXPORTS CSS_Logger
{
public:
CSS_Logger(void);
~CSS_Logger(void) ;
public:
static CSS_Logger* GetInstance();
public:
bool WriteErrorLogger(const char* e, ...);
bool WriteDebugLogger(const char* d, ...);
private:
bool WriteLogger(const std::string& log);
private:
static CSS_Logger *mInstance;
};