aspect c++跟踪函数控制流和输入输出参数
Posted
技术标签:
【中文标题】aspect c++跟踪函数控制流和输入输出参数【英文标题】:aspect c++ tracing function control flow and input output parameters 【发布时间】:2015-10-28 08:48:10 【问题描述】:我正在使用aspectc++来生成程序的控制流。
trace.ah
:
#ifndef __trace_ah__
#define __trace_ah__
#include <cstdio>
// Control flow tracing example
aspect trace
// print the function name before execution starts
pointcut virtual methods() = "% ...::%(...)";
advice execution (methods()) : before ()
cout << "entering: " << JoinPoint::signature() << endl;
// print input parameters**
advice execution(methods()) : after()
// print output parameters**
cout << "leaving: " << JoinPoint::signature() << endl;
//prints return values of non void functions
advice execution("% ...::%(...)" && !"void ...::%(...)") : after()
JoinPoint::Result res = *tjp->result();
cout << "leaving " << tjp->signature()<< " << returning value--" << res<<endl;
;
;
#endif
问题:
1.如何打印作为参数传递给函数的变量本身?
2.如何打印每个函数的输入参数值?
【问题讨论】:
【参考方案1】:#ifndef __trace_ah__
#define __trace_ah__
#include <cstdio>
#include <iostream>
using namespace std;
template <int I> struct ArgPrinter
template <class JP> static inline void work (JP &tjp)
ArgPrinter<I - 1>::work (tjp);
cout << "Arg " << I << ": " << *tjp.template arg<I - 1> () << endl;
;
template <> struct ArgPrinter<0>
template <class JP> static inline void work (JP &tjp)
;
// Control flow tracing example
aspect trace
pointcut virtual methods() = "% ...::%(...)";
template <class JP> void print_args (JP &tjp)
ArgPrinter<JP::ARGS>::work (tjp);
advice execution (methods()) : before ()
cout << "entering: " << JoinPoint::signature() << endl;
tjp->arg(0);
print_args (*tjp);
advice execution("% ...::%(...)" && !"void ...::%(...)") : after()
JoinPoint::Result res = *tjp->result();
cout << "leaving " << tjp->signature()<< " << returning value--" << res<<endl;
;
#endif
【讨论】:
以上是关于aspect c++跟踪函数控制流和输入输出参数的主要内容,如果未能解决你的问题,请参考以下文章