【发布时间】:2021-10-16 12:21:55
【问题描述】:
我有一个项目,我想在其中动态构建特定函数调用的图表。例如,如果我有 2 个模板类 A 和 B,其中 A 有一个跟踪方法(保存为图形节点),B 有 3 个方法(非跟踪方法、跟踪方法和一个调用 A 的跟踪方法的跟踪方法),那么我希望能够仅将跟踪的方法调用作为节点注册到图形对象中。图形对象可以是单例。
template <class TA>
class A
{
public:
void runTracked()
{
// do stuff
}
};
template <class TB>
class B
{
public:
void runNonTracked()
{
// do stuff
}
void runTracked()
{
// do stuff
}
void callATracked()
{
auto a = A<TB>();
a.runTracked();
// do stuff
}
};
void root()
{
auto b1 = B<int>();
auto b2 = B<double>();
b1.runTracked();
b2.runNonTracked();
b2.callATracked();
}
int main()
{
auto b = B<int>();
b.runTracked()
root();
return 0;
}
这应该会输出一个与下面类似的图形对象:
root()
\-- B<int>::runTracked()
\-- B<double>::callATracked()
\-- A<double>::runTracked()
跟踪的功能应该是可调的。如果根是可调节的(如上例所示),那将是最好的。 有没有简单的方法来实现这一点?
我正在考虑为跟踪的功能引入一个宏和一个单例图形对象,它将跟踪的函数注册为节点。但是,我不确定如何确定调用堆栈中最后跟踪的函数,或者(从图形的角度)当我想添加新节点时哪个图形节点应该是父节点。
【问题讨论】:
-
澄清一下:你想建立一个函数调用图吗?类似于“堆栈跟踪”的(过滤的)树形视图?
-
@Wolf 正是您所说的,但这不仅仅是我想要输出的图形,而是图形对象。
-
所以你想要一个动态图对象。我不明白,从“输出”中无法推断的是调用堆栈(实际上是 stack)和 tree 之间的关系图形。我猜你想要一个由特定调用引起的所有(跟踪)调用的图表(那是一棵树)(我认为你的情况是
root())? -
可以,但只包含特定元素。
-
我认为查看 Log4j 可能会有所帮助,这允许动态配置日志记录活动。即使这不是您想要的,那里的概念也可以帮助您理解您的问题。顺便说一句,使用模板是问题的一部分还是解决方案的一部分?
标签: c++ c++11 templates trace runtime-configuration