C++中的缩进跟踪

Indented trace in C++

本文关键字:跟踪 缩进 C++      更新时间:2023-10-16

我想为我们的大型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使用的dignotic消息。

如您所见,嵌套函数调用的跟踪彼此缩进。也许我知道有什么已经可用的东西,这样我就可以阻止自己重新发明轮子。

谢谢奥姆基

您需要跟踪调用深度:

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实际执行日志记录会好得多,但出于说明目的,这是演示您要执行的操作的最简单方法。

有很多用于C++的日志记录库,特别是我可以推荐 Log4cxx。它们将帮助您构建和配置应用程序的日志消息输出。要分析日志文件,您需要一个额外的工具,例如Apache Chainsaw。

另请参阅是否有用于 log4j 文件的日志文件分析器?