[aspectc-user] recording advice context
Olaf Spinczyk
Olaf.Spinczyk at informatik.uni-erlangen.de
Thu Sep 8 08:32:08 CEST 2005
Hello Mike,
ac++ transforms advice into member functions of the aspect, which
becomes a normal C++ class. Therefore, __FILE__ and __LINE__ don't help
here.
The only way to find out the filename and line for a join point
("shadow") (in the current version) is to print its ID
(JoinPoint::JPID). With this ID you can lookup the file and line
information in the generated project repository (-r option). The project
repository is an XML file with a quite simple structure.
This workaround is, of course, not satisfying. Therefore, future
versions of AspectC++ (including 1.0pre1) will have an extended join
point API that allows advice code to access the file and line
information at runtime.
I also agree that the signature of the calling function at a call join
point would also be desirable. We will work on this issue, but a
solution will not be integrated in the next release.
Best regards,
Olaf
Mike Mortensen wrote:
> Hi,
> This may be a really basic question about the JoinPoint API...
> I am using before advice as a development aspect to trace all calls into
> a particular library function. I want to track the last call to a
> particular library call (because the library calls exit rather than
> throwing
> an exception), but I'd also like to write out (for my own use) all
> calling contexts --
> specifically the name of the static function or method that called the
> library call.
>
> If the methods being called are all part of a class (otherClass), then I
> can write
> out the signature of each method call in otherClass, and I can use __LINE__
> and __FILE__ to quickly debug the exact call that triggered the exit:
>
> #include <iostream>
> using namespace std;
>
>
> aspect Action {
> advice call("% otherClass::%(...)") : before() {
> cerr << " Track otherClass -- before calling " <<
> JoinPoint::signature()
> << " at line " << __LINE__ << " of file " << __FILE__
> << endl;
> }
> };
>
> This advice prints out things like
> Track otherClass -- before calling unsigned int
> otherClass::NumPortsOnNet() const at line 11 of file Aspects.ah
> so I know what methods are being called -- which is important -- but the
> __LINE__ and __FILE__ information
> is embedded in Aspects.ah which is included in main.cc, so I don't get
> the 'context' or caller information.
>
> Suppose calls to methods of otherClass exist in:
> main
> myClass::foo()
> myClass::bar()
> void f()
> void g()
> Is there any way to print out the name of the calling function or
> method, rather than just what is being called
> or trying to use __LINE__ and __FILE__?
>
> Thanks,
> Mike
> _______________________________________________
> aspectc-user mailing list
> aspectc-user at aspectc.org
> http://www.aspectc.org/mailman/listinfo/aspectc-user
More information about the aspectc-user
mailing list