6 Replies Latest reply on Oct 28, 2011 12:39 PM by adinn

    invalid text outside of RULE/ENDRULE

    swimablefish

      this is my script:

       

          

      RULE trace assignTasks

      CLASS CapacityTaskScheduler

      METHOD assignTasks

      HELPER TraceHelper

      IF TRUE

      DO  traceOpen($0, "/home/hbase/panjy/tools/test_schedule/assignTask.log");

          traceln($0, "assign task")

      ENDRULE

       

       

      class TraceHelper extends Helper {

          public boolean traceln(Object identifier, String message) {

              Date d = new Date();

              SimpleDataFormat sdf = new SimpleDateFormat("HH:mm:ss");

              String str = sdf.format(d);

             

              return super.traceln(identifier, str + ": " + message)

          }  

      }  

       

      when i submit it, it print's error message as follow:

        

      Failed to process request: java.lang.Exception: The remote byteman agent reported an error:

      EXCEPTION java.lang.Exception: org.jboss.byteman.agent.Transformer : invalid text outside of RULE/ENDRULE at line 10 in script assignTask.btm

      java.lang.Exception: org.jboss.byteman.agent.Transformer : invalid text outside of RULE/ENDRULE at line 10 in script assignTask.btm

      at org.jboss.byteman.agent.ScriptRepository.processScripts(ScriptRepository.java:101)

      at org.jboss.byteman.agent.Retransformer.installScript(Retransformer.java:62)

      at org.jboss.byteman.agent.TransformListener.handleScripts(TransformListener.java:337)

      at org.jboss.byteman.agent.TransformListener.loadScripts(TransformListener.java:260)

      at org.jboss.byteman.agent.TransformListener.handleConnection(TransformListener.java:213)

      at org.jboss.byteman.agent.TransformListener.run(TransformListener.java:146)

       

       

      -- Args were: [assignTask.btm]

      java.lang.Exception: The remote byteman agent reported an error:

      EXCEPTION java.lang.Exception: org.jboss.byteman.agent.Transformer : invalid text outside of RULE/ENDRULE at line 10 in script assignTask.btm

      java.lang.Exception: org.jboss.byteman.agent.Transformer : invalid text outside of RULE/ENDRULE at line 10 in script assignTask.btm

      at org.jboss.byteman.agent.ScriptRepository.processScripts(ScriptRepository.java:101)

      at org.jboss.byteman.agent.Retransformer.installScript(Retransformer.java:62)

      at org.jboss.byteman.agent.TransformListener.handleScripts(TransformListener.java:337)

      at org.jboss.byteman.agent.TransformListener.loadScripts(TransformListener.java:260)

      at org.jboss.byteman.agent.TransformListener.handleConnection(TransformListener.java:213)

      at org.jboss.byteman.agent.TransformListener.run(TransformListener.java:146)

       

       

              at org.jboss.byteman.agent.submit.Submit$Comm.readResponse(Submit.java:882)

              at org.jboss.byteman.agent.submit.Submit.submitRequest(Submit.java:738)

              at org.jboss.byteman.agent.submit.Submit.addScripts(Submit.java:574)

              at org.jboss.byteman.agent.submit.Submit.addRulesFromFiles(Submit.java:547)

              at org.jboss.byteman.agent.submit.Submit.main(Submit.java:1063)

       

      what is the problem? There is an example in Byteman Programmer's Guide like this.

        • 1. Re: invalid text outside of RULE/ENDRULE
          swimablefish

          furthermore, if i change script like this

           

           

          RULE trace assignTasks

          CLASS CapacityTaskScheduler

          METHOD assignTasks

          #HELPER TraceHelper

          BIND i = new Date();

               j = 2;

               k = 3

          IF TRUE

          DO  traceOpen($0, "/home/hbase/panjy/tools/test_schedule/assignTask.log");

               traceln($0, "assign task")

          ENDRULE

           

          it will tell:

           

          # File assignTask.btm line 5

          RULE trace assignTasks

          CLASS CapacityTaskScheduler

          METHOD assignTasks

          AT ENTRY

           

           

          BIND i = new java.utils.Date();

          j = 2;

          k = 3

          IF TRUE

          DO  traceOpen($0, "/home/hbase/panjy/tools/test_schedule/assignTask.log");

          traceln($0, "assign task")

          ENDRULE

          Transformed in:

          loader: sun.misc.Launcher$AppClassLoader@553f5d07

          trigger method: org.apache.hadoop.mapred.CapacityTaskScheduler.assignTasks(org.apache.hadoop.mapred.TaskTrackerStatus) java.util.List

          failed to compile

          Rule.ensureTypeCheckedCompiled : error type checking rule trace assignTasks

          org.jboss.byteman.rule.exception.TypeException: NewExpression.typeCheck : unknown type java.utils.Date file assignTask.btm line 6

          at org.jboss.byteman.rule.expression.NewExpression.typeCheck(NewExpression.java:122)

          at org.jboss.byteman.rule.binding.Binding.typeCheck(Binding.java:119)

          at org.jboss.byteman.rule.Event.typeCheck(Event.java:114)

          at org.jboss.byteman.rule.Event.typeCheck(Event.java:106)

          at org.jboss.byteman.rule.Rule.typeCheck(Rule.java:521)

          at org.jboss.byteman.rule.Rule.ensureTypeCheckedCompiled(Rule.java:449)

          at org.jboss.byteman.rule.Rule.execute(Rule.java:670)

          at org.jboss.byteman.rule.Rule.execute(Rule.java:651)

          • 2. Re: invalid text outside of RULE/ENDRULE
            adinn

            swimablefish wrote:

             

            this is my script:

             

                

            RULE trace assignTasks

            CLASS CapacityTaskScheduler

            METHOD assignTasks

            HELPER TraceHelper

            IF TRUE

            DO  traceOpen($0, "/home/hbase/panjy/tools/test_schedule/assignTask.log");

                traceln($0, "assign task")

            ENDRULE

             

             

            class TraceHelper extends Helper {

                public boolean traceln(Object identifier, String message) {

                    Date d = new Date();

                    SimpleDataFormat sdf = new SimpleDateFormat("HH:mm:ss");

                    String str = sdf.format(d);

                   

                    return super.traceln(identifier, str + ": " + message)

                }  

            }

             

            It looks to me like your script includes the definiiton of class TraceHelper.Is that the case? If so then this is what is causng the syntax error.

             

            If you want to use a helper class then you need to compile the helper using javac, place the helper class in a jar and then install the jar into the relevant classpath. So,for example in this case you would need to execute something like

             

            $javac -classpath $BYTEMAN_HOME/lib/byteman.jar TraceHelper.java

            . . .

            $jar cvf tracehelper.jar TraceHelper.class

            . . .

            bmjava -b tracehelper.jar -l myscript.btm MyApp foo bar baz

             

            A few words of explanation might help

             

            • you need to compile the helper class with byteman.jar i teh classpath because it refers to class Helper
            • the -s option to bmjava tells the agent to add your jar file tracehelper.jar into the bootstrap classpath so it is visible to all classes in the system
            • you can also use flag -s to load your jar into the system classpath which is ok if you only want to inject rules into application code but will not work if you inject rules into JVM classes

             

            You can also use bmsubmit to install a helper jar into a running program e.g.

             

            $ bmsubmit -b tracehelper.jar

            $ bmsubmit myscript.btm

             

            Obviously you need to load the jar before you submit any rules which refer to your helper class.

            • 3. Re: invalid text outside of RULE/ENDRULE
              swimablefish

              I used the 2nd method

                   

              ${BYTEMAN_HOME}/bin/bminstall.sh -p $BYTEMAN_PORT $pid

               

              ${BYTEMAN_HOME}/bin/bmsubmit.sh -p $BYTEMAN_PORT -b "tracehelper.jar"

              ${BYTEMAN_HOME}/bin/bmsubmit.sh -p $BYTEMAN_PORT -l "assignTask.btm"

               

              but it still failed...

               

              Failed to process request: java.lang.Exception: The remote byteman agent reported an error:

              EXCEPTION Unable to add jar file tracehelper.jar

              java.util.zip.ZipException: error in opening zip file

              java.util.zip.ZipException: error in opening zip file

              at java.util.zip.ZipFile.open(Native Method)

              at java.util.zip.ZipFile.<init>(ZipFile.java:114)

              at java.util.jar.JarFile.<init>(JarFile.java:133)

              at java.util.jar.JarFile.<init>(JarFile.java:97)

              at org.jboss.byteman.agent.TransformListener.loadJars(TransformListener.java:269)

              at org.jboss.byteman.agent.TransformListener.handleConnection(TransformListener.java:211)

              at org.jboss.byteman.agent.TransformListener.run(TransformListener.java:146)

               

               

              -- Args were: [tracehelper.jar]

              java.lang.Exception: The remote byteman agent reported an error:

              EXCEPTION Unable to add jar file tracehelper.jar

              java.util.zip.ZipException: error in opening zip file

              java.util.zip.ZipException: error in opening zip file

              at java.util.zip.ZipFile.open(Native Method)

              at java.util.zip.ZipFile.<init>(ZipFile.java:114)

              at java.util.jar.JarFile.<init>(JarFile.java:133)

              at java.util.jar.JarFile.<init>(JarFile.java:97)

              at org.jboss.byteman.agent.TransformListener.loadJars(TransformListener.java:269)

              at org.jboss.byteman.agent.TransformListener.handleConnection(TransformListener.java:211)

              at org.jboss.byteman.agent.TransformListener.run(TransformListener.java:146)

               

               

                      at org.jboss.byteman.agent.submit.Submit$Comm.readResponse(Submit.java:882)

                      at org.jboss.byteman.agent.submit.Submit.submitRequest(Submit.java:738)

                      at org.jboss.byteman.agent.submit.Submit.addJarsToSystemClassloader(Submit.java:485)

                      at org.jboss.byteman.agent.submit.Submit.main(Submit.java:1047)

              install rule trace assignTasks

              • 4. Re: invalid text outside of RULE/ENDRULE
                adinn

                swimablefish wrote:

                 

                I used the 2nd method

                 

                ${BYTEMAN_HOME}/bin/bminstall.sh -p $BYTEMAN_PORT $pid

                 

                ${BYTEMAN_HOME}/bin/bmsubmit.sh -p $BYTEMAN_PORT -b "tracehelper.jar"

                ${BYTEMAN_HOME}/bin/bmsubmit.sh -p $BYTEMAN_PORT -l "assignTask.btm"

                 

                but it still failed...

                 

                Failed to process request: java.lang.Exception: The remote byteman agent reported an error:

                EXCEPTION Unable to add jar file tracehelper.jar

                java.util.zip.ZipException: error in opening zip file

                java.util.zip.ZipException: error in opening zip file

                at java.util.zip.ZipFile.open(Native Method)

                at java.util.zip.ZipFile.<init>(ZipFile.java:114)

                at java.util.jar.JarFile.<init>(JarFile.java:133)

                at java.util.jar.JarFile.<init>(JarFile.java:97)

                at org.jboss.byteman.agent.TransformListener.loadJars(TransformListener.java:269)

                at org.jboss.byteman.agent.TransformListener.handleConnection(TransformListener.java:211)

                at org.jboss.byteman.agent.TransformListener.run(TransformListener.java:146)

                 

                Ah, closer. In fact, almost there :-)

                 

                It looks to me like the agent is running in a JVM process which has a working directory different to the one you are running the bmsubmit command from. So, when the agent checks to see if it canr ead tracehelper.jar it tries to open it in its working directory and does not find it. If you pass an absolute path fo rthe helper jar then this should resolve the problem i.e. execute this

                 

                $BYTEMAN_HONE/bin/bmsubmit.sh -p $BYTEMAN_PORT -b "$PWD/tracehelper.jar"

                 

                where $PWD should identify the current working directory something like

                 

                /home/adinn/byteman/helpertest

                • 5. Re: invalid text outside of RULE/ENDRULE
                  swimablefish

                  yeah, it can work now,

                     but I used "-s", not "-b". Although "-b" didn't print any error message, the script didn't work.  "-s" worked well.

                   

                     by the way, I still can't figure out the differences between "-s" and "-b", 3ks,

                  • 6. Re: invalid text outside of RULE/ENDRULE
                    adinn

                    swimablefish wrote:

                     

                    yeah, it can work now,

                       but I used "-s", not "-b". Although "-b" didn't print any error message, the script didn't work.  "-s" worked well.

                     

                    Well, -b does also work.

                     

                     

                    swimablefish wrote:

                     

                    by the way, I still can't figure out the differences between "-s" and "-b", 3ks,

                     

                    It's to do with the visibility of the helper classes. You need to use -b if you want to inject a rule which uses your helper into a method of a JVM class like java.lang.Thread or java.io.FileInputstream. These classes are loaded by the bootstrap classloader which is different  to the system classloader normally used to load application code. Installing your helperc jar in the bootstrap classpath means that references to it can be injected into the JVM classes. If you install it into the system loader and then try ot inject a rule into a JVM class the you will get an unresolved reference to you helper class. The same applies when you load the the agent. If you want to install ruels into JVM classes then you need to load the agent jar into the bootstrap classpath. You can do this by passing-b to the bminstall.sh command or to bmjava.sh or by specifying boot:byteman.jar as an option to the -javaagennt java command line argument