Oh, I forgot to mention a little trick I use often in situations like these: I do not create a full copy of rt.jar, but just a small jar of woven JRE classes which I *prepend* to the bootclasspath, so the classes therein are found by the system classloader *before* the ones in the original rt.jar.
-- Alexander Kriegisch > Am 07.11.2013 um 23:22 schrieb Alexander Kriegisch <alexan...@kriegisch.name>: > > Your intention is to profile low level calls. Whether you like it or not, I > think weaving rt.jar is the best choice because it does not have as much > overhead as the solutions you are thinking of. Profiling is usually not done > in production environments, so weaving the JRE should not be too much trouble. > > -- > Alexander Kriegisch > > >> Am 07.11.2013 um 21:56 schrieb Jonathan Mace <jcm...@cs.brown.edu>: >> >> Thanks for your response Andy. >> >> Consider the following alternative approach to 'marking' the instances I'm >> interested in. I maintain a WeakHashSet<FilterInputStream> to reference all >> input streams that i'm interested in. I weave all constructor calls to >> FilterInputStream, adding this new stream to the set if either a) it's >> filtering a FileInputStream or b) it's filtering another FilterInputStream >> that already belongs to the set. Then I weave all calls to >> FilterInputStream+.read(..), adding an if() in the pointcut to test for >> membership in the set. >> >> It would suffer the same drawbacks of not instrumenting rt.jar, but would be >> pretty easy to implement. But, would this impose a lot of additional >> overhead? >> >> Cheers, >> >> Jon >> >> >>> On 7 November 2013 15:48, Andy Clement <andrew.clem...@gmail.com> wrote: >>> > I'll also mention that I don't want to weave rt.jar. >>> >>> Shame, that would make it rather easy with a pointcut on execution of >>> FileInputStream+.read(..). >>> >>> I can imagine your proxy route might work. You can advise the constructor >>> calls to the various FilterInputStream and FilterOutputStreams, and there >>> return a proxy with an additional marker interface. Sounds pretty messy >>> compared to what you are already doing though... There isn't anything >>> special in AspectJ to help here, simply around advice on the constructor >>> call to 'new' and then use cglib to generate the tagged proxy. If some of >>> those constructor calls are made inside rt.jar though, you won't be >>> catching them. (similar to now where you won't be catching calls to read >>> that are made inside classes within rt.jar) >>> >>> cheers, >>> Andy >>> >>> >>>> On 6 November 2013 14:29, Jonathan Mace <jcm...@cs.brown.edu> wrote: >>>> Hi everyone, >>>> >>>> Love AspectJ. I work on end-to-end tracing using X-Trace, and AspectJ is >>>> an awesome mechanism to do some of the tracing that I'm interested in. >>>> >>>> I'm trying to profile file accesses; specifically, calls to >>>> FileInputStream+.read(..) and FileOutputStream+.write(..). However, in >>>> many cases, file streams are wrapped in filter classes, such as Buffered >>>> streams or Data streams. The specific base classes that provide this >>>> mechanism are FilterInputStream and FilterOutputStream. Often, multiple >>>> filter streams are applied recursively to some base stream, for example >>>> new DataOutputStream(new BufferedOutputStream(new >>>> FileOutputStream("myfile.txt"))); >>>> >>>> Is there a way to define a pointcut that matches any Filter stream, whose >>>> underlying stream is a File stream? The naive solution I have so far is: >>>> >>>> Object around(FilterInputStream o): target(o) && call(* >>>> FilterInputStream+.read(..)) { >>>> InputStream base = o; >>>> while (base instanceof FilterInputStream) >>>> base = ((FilterInputStream) base).in; >>>> boolean isFileStream = base instanceof FileInputStream; >>>> >>>> if (isFileStream) { >>>> long start = System.nanoTime(); >>>> Object ret = proceed(o); >>>> long duration = System.nanoTime() - start; >>>> // do profiling stuff >>>> return ret; >>>> } else { >>>> return proceed(o); >>>> } >>>> } >>>> >>>> I'm worried about the overhead of recursively examining the filter streams >>>> to determine whether the base stream is a file stream. I'll also mention >>>> that I don't want to weave rt.jar. It would be great if I could insert >>>> some kind of proxy class when the appropriate Filter instance is created, >>>> then the pointcut can just look for the proxy class. >>>> >>>> Cheers, >>>> >>>> Jon >>>> >>>> _______________________________________________ >>>> aspectj-users mailing list >>>> aspectj-users@eclipse.org >>>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >>> >>> >>> _______________________________________________ >>> aspectj-users mailing list >>> aspectj-users@eclipse.org >>> https://dev.eclipse.org/mailman/listinfo/aspectj-users >> >> _______________________________________________ >> aspectj-users mailing list >> aspectj-users@eclipse.org >> https://dev.eclipse.org/mailman/listinfo/aspectj-users
_______________________________________________ aspectj-users mailing list aspectj-users@eclipse.org https://dev.eclipse.org/mailman/listinfo/aspectj-users