当前位置: 代码迷 >> C++ >> AspectC++的施用
  详细解决方案

AspectC++的施用

热度:10796   发布时间:2013-02-26 00:00:00.0
AspectC++的应用

最近需要研究一个开源软件中协议的流程与实现,由于协议比较复杂,程序层次架构设计耦合严重,用wireshark抓包分析+log或者gdb跟踪代码效率都不高.想到之前java项目用过一种切面编程,可以在函数开始或结束等地方自动添加代码,而且有比较灵活的控制方式.当时注意到CPP也有这种编程的实现,于是琢磨着用到此项目中来.

项目主页:http://www.aspectc.org/

直接下编译链接好的linux下的包,然后开始编例子.

编译出现麻烦点,编译器报错:

sorry, unimplemented: inlining failed in call to ...

查看了一下源文件,是编译器不识别类似于下面的定义:

__attribute((always_inline)) inline void xxx ();

google了一番,找到解决方法:http://gcc.gnu.org/ml/gcc-help/2007-01/msg00051

加上-funit-at-a-time编译选项.

尝试在项目里使用.

改makefile,照葫芦画瓢,按照例子改就是.

写ah文件,最简单的用例:

使用% %::%::%(...)匹配几乎所有namespace里的所有类的所有函数.(使用% %::%(...)匹配所有类的所有函数)

发现编译某些文件时,会生成带%的函数名,编译不通过,怀疑ag++生成函数名的时候有bug.遍寻不知解.

只好把匹配串改成:

% AAA::BBB::%(...)

使用JoinPoint::signature()打印所属函数名.

费了点功夫,但是编译通过,运行无碍.能看到程序的基本运行流程了.

只能算用了AspectC++的皮毛.还需精研.

  相关解决方案