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++跟踪函数控制流和输入输出参数的主要内容,如果未能解决你的问题,请参考以下文章

C++学习摘要之九:C++流和文件流

C++学习笔记C++输入输出流

文件流

conio.h是哪个头文件?

vs2020怎么输数据

print函数各输出项之间用啥进行隔开