C++中的缩进跟踪
Indented trace in C++
我想为我们的大型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 文件的日志文件分析器?
相关文章:
- clang格式:宏的缩进
- C++setiosflags函数操纵器-未确定的缩进
- VSCode 中带有 C/C++ 扩展名的多行注释缩进错误
- 如何使用c++调整文本文件中代码的缩进?
- 如何在C++中制作 clang 格式的缩进 extern C 块?
- 在 vscode 中使用特定缩进/对齐 C/C++ 自动格式化
- "If Else"语句缩进在C++中是否重要?
- CLion 行注释的不一致自动缩进
- 如何在用户按Enter键时控制wxStyledTextCtrl中的行缩进
- 如何在 QLabel 中将缩进设置为 QImage
- 如何使 clang 格式将所有详细信息命名空间缩进一个
- 是否可以更改 Xcode 缩进注释行的方式
- 用libxml2缩进合并的XML文件
- 精美的C 容器,具有级别的缩进
- 如何在使用clang-format访问修饰符后缩进
- 如何使用Visual Studio轻松缩进标头声明
- 禁止 emacs 中的 c++ 命名空间缩进
- 我怎样才能让 Emacs 用我的代码缩进我的 // 注释
- 正在vim中加载google.vim缩进文件
- C++中的缩进跟踪