我想为我们的大型C ++代码库开发缩进跟踪,这对开发人员找到问题特别有帮助。我想要缩进跟踪功能。例如,请考虑以下代码: -
void FunctionA()
{
TR_ENTER("Function A");
TR_PRINT("Dignostic message Function A");
FunctionB(); // Call function B
}
void FunctionB()
{
TR_ENTER("Function B");
TR_PRINT("Dignostic message Function B");
FunctionC(); // Call function B
}
void FunctionC()
{
TR_ENTER("Function C");
TR_PRINT("Dignostic message Function C");
}
正如您所看到的,上面的调用是相互嵌套的。我想生成跟踪日志,如下所示:
Function A - Start
Dignostic message Function A
Function B - Start
Dignostic message Function B
Function C - Start
Dignostic message Function C
Function C - End
Function B - End
Function A - End
TR_ENTER和TR_PRINT是我用作示例的一些宏。要说函数启动我已经使用了TR_ENTER并打印了一些有意义的消息,我使用了TR_PRINT。
正如您所看到的,嵌套函数调用的跟踪在彼此之间缩进。我是否知道有什么可用的东西可以阻止我自己重新发明轮子。
谢谢, Omky
答案 0 :(得分:7)
您需要跟踪呼叫深度:
class trace_entry;
class trace_log {
public:
trace_log() : depth_(0) { }
private:
// noncopyable so we don't accidentally copy it
trace_log(trace_log&);
void operator=(trace_log);
friend trace_entry;
int depth_;
};
class trace_entry {
public:
trace_entry(trace_log& log, const std::string& frame)
: log_(log), frame_(frame) {
std::cout << std::string(4 * log.depth_, ' ')
<< "ENTER " << frame_ << std::endl;
++log_.depth_;
}
~trace_entry() {
--log_.depth_;
std::cout << std::string(4 * log_.depth_, ' ')
<< "EXIT " << frame_ << std::endl;
}
private:
// noncopyable so we don't accidentally copy it
trace_entry(trace_entry&);
void operator=(trace_entry);
trace_log& log_;
std::string frame_;
};
用法示例:
void a(trace_log& log) {
trace_entry e(log, "a");
}
void b(trace_log& log) {
trace_entry e(log, "b");
return a(log);
}
int main() {
trace_log log;
trace_entry e(log, "main");
b(log);
}
输出:
ENTER main
ENTER b
ENTER a
EXIT a
EXIT b
EXIT main
这很容易扩展,以支持其他形式的日志记录,允许其他日志消息,以及您想要做的任何其他事情。 (让trace_log
实际执行日志记录会好得多,但出于展示的目的,这是演示您要执行的操作的最简单方法。)
答案 1 :(得分:0)
C ++有很多日志库,特别是我可以推荐Log4cxx。它们将帮助您构建和配置应用程序的日志消息输出。要分析日志文件,您需要一个额外的工具,如Apache Chainsaw。