Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [aspectj-users] LTW : thisJoinPoint.getStaticPart().getSourceLocation().getLine() always returns 0

Yep, you are right, most compilers will include the line number info, just a peculiarity of the default ant options. Sorry I didn't get back to you sooner, my next question after you mentioned they were missing would have been "are you using Ant to compile the code?" - so I'm glad you got to the bottom of it.

Andy


On 29 December 2012 08:46, Pasturel <jean-louis.pasturel@xxxxxxxxx> wrote:
Hi,
My bad !
i use the javac Ant task to compile the TestingClass ( to avoid CTW weaving) , which "debug" parameter is Off by default, turning it to On, all runs as expected, and thethisJoinPoint.getStaticPart().getSourceLocation().getLine()  returns the correct line number
Sorry for the noise
Compiling with iajc for weaving at Compile Time, certainly uses javac with debug set to On, am i right?

Le 28/12/2012 10:24, Pasturel a écrit :
Hi,
I am not an expert of javap analysis.
I try to join the whole trace.

I think you are right. decompiling the TestingClass with JD-GUI, doesn't show any line number.

has i made something wrong, at compilation time ?

extract of javap -verbose TestingClass :
 
public class jlp.aspectj.test.TestingClass extends java.lang.Object implements java.lang.Runnable
  minor version: 0
  major version: 49
  Constant pool:
const #1 = Field    #40.#69;    //  jlp/aspectj/test/TestingClass.name:Ljava/lang/String;
const #2 = Method    #44.#70;    //  java/lang/Object."<init>":()V
const #3 = String    #71;    // 
const #4 = Field    #40.#72;    //  jlp/aspectj/test/TestingClass.running:Z
const #5 = int    1000000;
const #6 = Field    #40.#73;    //  jlp/aspectj/test/TestingClass.limit:I
const #7 = class    #74;    //  java/lang/Thread
const #8 = Method    #7.#75;    //  java/lang/Thread."<init>":(Ljava/lang/Runnable;)V
const #9 = Field    #40.#76;    //  jlp/aspectj/test/TestingClass.thread:Ljava/lang/Thread;
const #10 = String    #77;    //  no_name
const #11 = Method    #40.#78;    //  jlp/aspectj/test/TestingClass."<init>":(Ljava/lang/String;)V
const #12 = Field    #79.#80;    //  java/lang/System.out:Ljava/io/PrintStream;
const #13 = class    #81;    //  java/lang/StringBuilder
const #14 = Method    #13.#70;    //  java/lang/StringBuilder."<init>":()V
const #15 = Method    #13.#82;    //  java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #16 = String    #83;    //  .myShortMethod : I will sleep for 100 ms
const #17 = Method    #13.#84;    //  java/lang/StringBuilder.toString:()Ljava/lang/String;
const #18 = Method    #85.#86;    //  java/io/PrintStream.println:(Ljava/lang/String;)V
const #19 = long    100l;
const #21 = Method    #7.#87;    //  java/lang/Thread.sleep:(J)V
const #22 = class    #88;    //  java/lang/InterruptedException
const #23 = Method    #22.#89;    //  java/lang/InterruptedException.printStackTrace:()V
const #24 = String    #90;    //  .myLongMethod : I will sleep for 1s
const #25 = long    1000l;
const #27 = class    #91;    //  java/util/HashMap
const #28 = Method    #27.#70;    //  java/util/HashMap."<init>":()V
const #29 = String    #92;    //  .myStressingMethod :  limit=
const #30 = Method    #13.#93;    //  java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
const #31 = class    #94;    //  java/lang/Integer
const #32 = Method    #31.#95;    //  java/lang/Integer."<init>":(I)V
const #33 = Method    #31.#84;    //  java/lang/Integer.toString:()Ljava/lang/String;
const #34 = Method    #27.#96;    //  java/util/HashMap.put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
const #35 = Method    #27.#97;    //  java/util/HashMap.clear:()V
const #36 = Method    #40.#98;    //  jlp/aspectj/test/TestingClass.myShortMethod:()V
const #37 = Method    #40.#99;    //  jlp/aspectj/test/TestingClass.myStressingMethod:(I)V
const #38 = Method    #40.#100;    //  jlp/aspectj/test/TestingClass.myLongMethod:()V
const #39 = Method    #31.#101;    //  java/lang/Integer.parseInt:(Ljava/lang/String;)I
const #40 = class    #102;    //  jlp/aspectj/test/TestingClass
const #41 = String    #103;    //  thread_
const #42 = Method    #40.#104;    //  jlp/aspectj/test/TestingClass."<init>":(Ljava/lang/String;I)V
const #43 = Method    #7.#105;    //  java/lang/Thread.start:()V
const #44 = class    #106;    //  java/lang/Object
const #45 = class    #107;    //  java/lang/Runnable
const #46 = Asciz    name;
const #47 = Asciz    Ljava/lang/String;;
const #48 = Asciz    running;
const #49 = Asciz    Z;
const #50 = Asciz    limit;
const #51 = Asciz    I;
const #52 = Asciz    thread;
const #53 = Asciz    Ljava/lang/Thread;;
const #54 = Asciz    getName;
const #55 = Asciz    ()Ljava/lang/String;;
const #56 = Asciz    Code;
const #57 = Asciz    setName;
const #58 = Asciz    (Ljava/lang/String;)V;
const #59 = Asciz    <init>;
const #60 = Asciz    (Ljava/lang/String;I)V;
const #61 = Asciz    ()V;
const #62 = Asciz    myShortMethod;
const #63 = Asciz    myLongMethod;
const #64 = Asciz    myStressingMethod;
const #65 = Asciz    (I)V;
const #66 = Asciz    run;
const #67 = Asciz    main;
const #68 = Asciz    ([Ljava/lang/String;)V;
const #69 = NameAndType    #46:#47;//  name:Ljava/lang/String;
const #70 = NameAndType    #59:#61;//  "<init>":()V
const #71 = Asciz    ;
const #72 = NameAndType    #48:#49;//  running:Z
const #73 = NameAndType    #50:#51;//  limit:I
const #74 = Asciz    java/lang/Thread;
const #75 = NameAndType    #59:#108;//  "<init>":(Ljava/lang/Runnable;)V
const #76 = NameAndType    #52:#53;//  thread:Ljava/lang/Thread;
const #77 = Asciz    no_name;
const #78 = NameAndType    #59:#58;//  "<init>":(Ljava/lang/String;)V
const #79 = class    #109;    //  java/lang/System
const #80 = NameAndType    #110:#111;//  out:Ljava/io/PrintStream;
const #81 = Asciz    java/lang/StringBuilder;
const #82 = NameAndType    #112:#113;//  append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
const #83 = Asciz    .myShortMethod : I will sleep for 100 ms;
const #84 = NameAndType    #114:#55;//  toString:()Ljava/lang/String;
const #85 = class    #115;    //  java/io/PrintStream
const #86 = NameAndType    #116:#58;//  println:(Ljava/lang/String;)V
const #87 = NameAndType    #117:#118;//  sleep:(J)V
const #88 = Asciz    java/lang/InterruptedException;
const #89 = NameAndType    #119:#61;//  printStackTrace:()V
const #90 = Asciz    .myLongMethod : I will sleep for 1s;
const #91 = Asciz    java/util/HashMap;
const #92 = Asciz    .myStressingMethod :  limit=;
const #93 = NameAndType    #112:#120;//  append:(I)Ljava/lang/StringBuilder;
const #94 = Asciz    java/lang/Integer;
const #95 = NameAndType    #59:#65;//  "<init>":(I)V
const #96 = NameAndType    #121:#122;//  put:(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;
const #97 = NameAndType    #123:#61;//  clear:()V
const #98 = NameAndType    #62:#61;//  myShortMethod:()V
const #99 = NameAndType    #64:#65;//  myStressingMethod:(I)V
const #100 = NameAndType    #63:#61;//  myLongMethod:()V
const #101 = NameAndType    #124:#125;//  parseInt:(Ljava/lang/String;)I
const #102 = Asciz    jlp/aspectj/test/TestingClass;
const #103 = Asciz    thread_;
const #104 = NameAndType    #59:#60;//  "<init>":(Ljava/lang/String;I)V
const #105 = NameAndType    #126:#61;//  start:()V
const #106 = Asciz    java/lang/Object;
const #107 = Asciz    java/lang/Runnable;
const #108 = Asciz    (Ljava/lang/Runnable;)V;
const #109 = Asciz    java/lang/System;
const #110 = Asciz    out;
const #111 = Asciz    Ljava/io/PrintStream;;
const #112 = Asciz    append;
const #113 = Asciz    (Ljava/lang/String;)Ljava/lang/StringBuilder;;
const #114 = Asciz    toString;
const #115 = Asciz    java/io/PrintStream;
const #116 = Asciz    println;
const #117 = Asciz    sleep;
const #118 = Asciz    (J)V;
const #119 = Asciz    printStackTrace;
const #120 = Asciz    (I)Ljava/lang/StringBuilder;;
const #121 = Asciz    put;
const #122 = Asciz    (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;;
const #123 = Asciz    clear;
const #124 = Asciz    parseInt;
const #125 = Asciz    (Ljava/lang/String;)I;
const #126 = Asciz    start;


Le 28/12/2012 02:54, Andy Clement a écrit :
Hi,

Can you confirm if the code you are load time weaving into has line number table entries? Use javap with -verbose to see them if they are there, look for one attached to each method.  If they are missing that explains it, if they are not missing it seems like a bug.

cheers,
Andy


On 24 December 2012 07:37, Pasturel <jean-louis.pasturel@xxxxxxxxx> wrote:
Le 24/12/2012 16:04, Pasturel a écrit :
Le 24/12/2012 12:25, Pasturel a écrit :
Hi,
withAspectJ Compiler 1.7.1 (DEVELOPMENT - Built: Wednesday Oct 24, 2012 at 18:06:22 GMT) and LTW,
the call  thisJoinPoint.getStaticPart().getSourceLocation().getLine() always returns 0

My advice is an around advice. I test if( null != thisJoinPoint.getStaticPart().getSourceLocation())
The pointcut is correctly weaved, and the advice excecutes correctly ( except for retrieving the noLine)

How can we explain this? a bug ?
I  give below the code to test ( my tests give always a getLine() =0)  :

The Class :

package jlp.aspectj.test;

import java.util.HashMap;
public class TestingClass implements Runnable {
    private String name = "";
    public boolean running = true;
    private int limit = 1000000;
    Thread thread = new Thread(this);

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;

    }

    public TestingClass(String name, int limit) {
        this.name = name;
        this.limit = limit;
    }

    public TestingClass(String name) {
        this.name = name;
    }

    public TestingClass() {
        this("no_name");

    }

    public void myShortMethod() {
        System.out.println("I will sleep for 100 ms");
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void myLongMethod() {
        System.out.println("I will sleep for 1s");
        try {

            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public void myStressingMethod(int limit) {
        HashMap<String, Integer> hm = new HashMap<String, Integer>();
        System.out.println("Entering in myStressingMethod limit=" + limit);
        for (int i = 0; i < limit; i++) {
            hm.put(new Integer(i % 100).toString(), new Integer(i % 1000));
        }
        hm.clear();

    }

    public void run() {
        while (running) {

            myShortMethod();

            myStressingMethod(limit);
            myLongMethod();
        }
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TestingClass[] tabRunners = new TestingClass[Integer.parseInt(args[0])];
        for (int i = 0; i < tabRunners.length; i++) {
            tabRunners[i] = new TestingClass("thread_" + i,
                    Integer.parseInt(args[1]));
            tabRunners[i].thread.start();
        }
    }

}


The AspectJ to (LTW) weave :

package jlp.perf.aspects.concreteAspects;

public aspect ConcreteTester {
    public  pointcut methods():execution(public * *..*.*(..));
    Object around() : methods()
    {
    Object ret = proceed();
    String str="Aspect ConcreteTester :"+thisJoinPointStaticPart.getSignature().getDeclaringTypeName()+"."+
            thisJoinPointStaticPart.getSignature().getName()+";"+thisJoinPointStaticPart
            .getSourceLocation().getLine();
    System.out.println(str);
   
    return ret;
    }

}




_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users
but Compile Time Weaving makes the Aspect running correctly, as shown by the traces below :
I will sleep for 1s
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myShortMethod;39
Entering in myStressingMethod limit=1000000
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myStressingMethod;61

I will sleep for 1s
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myShortMethod;39
Entering in myStressingMethod limit=1000000
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myLongMethod;49

I will sleep for 100 ms
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myStressingMethod;61

I will sleep for 1s
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myShortMethod;39
Entering in myStressingMethod limit=1000000
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myLongMethod;49

I will sleep for 100 ms
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myStressingMethod;61

I will sleep for 1s
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myStressingMethod;61

I will sleep for 1s
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myShortMethod;39
Entering in myStressingMethod limit=1000000
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myShortMethod;39
Entering in myStressingMethod limit=1000000
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myStressingMethod;61

I will sleep for 1s
Aspect ConcreteTester :jlp.aspectj.test.TestingClass.myStressingMethod;61

I will sleep for 1s


_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users




_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



_______________________________________________
aspectj-users mailing list
aspectj-users@xxxxxxxxxxx
https://dev.eclipse.org/mailman/listinfo/aspectj-users



Back to the top