最近需要研究一个开源软件中协议的流程与实现,由于协议比较复杂,程序层次架构设计耦合严重,用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++的皮毛.还需精研.