• Ben Gainey's avatar
    perf jvmti: Generate correct debug information for inlined code · ca58d7e6
    Ben Gainey authored
    tools/perf/jvmti is broken in so far as it generates incorrect debug
    information. Specifically it attributes all debug lines to the original
    method being output even in the case that some code is being inlined
    from elsewhere.  This patch fixes the issue.
    
    To test (from within linux/tools/perf):
    
    export JDIR=/usr/lib/jvm/java-8-openjdk-amd64/
    make
    cat << __EOF > Test.java
    public class Test
    {
        private StringBuilder b = new StringBuilder();
    
        private void loop(int i, String... args)
        {
            for (String a : args)
                b.append(a);
    
            long hc = b.hashCode() * System.nanoTime();
    
            b = new StringBuilder();
            b.append(hc);
    
            System.out.printf("Iteration %d = %d\n", i, hc);
        }
    
        public void run(String... args)
        {
            for (int i = 0; i < 10000; ++i)
            {
                loop(i, args);
            }
        }
    
        public static void main(String... args)
        {
            Test t = new Test();
            t.run(args);
        }
    }
    __EOF
    $JDIR/bin/javac Test.java
    ./perf record -F 10000 -g -k mono $JDIR/bin/java -agentpath:`pwd`/libperf-jvmti.so Test
    ./perf inject --jit -i perf.data -o perf.data.jitted
    ./perf annotate -i perf.data.jitted --stdio | grep Test\.java: | sort -u
    
    Before this patch, Test.java line numbers get reported that are greater
    than the number of lines in the Test.java file.  They come from the
    source file of the inlined function, e.g. java/lang/String.java:1085.
    For further validation one can examine those lines in the JDK source
    distribution and confirm that they map to inlined functions called by
    Test.java.
    
    After this patch, the filename of the inlined function is output
    rather than the incorrect original source filename.
    Signed-off-by: default avatarBen Gainey <ben.gainey@arm.com>
    Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    Tested-by: default avatarStephane Eranian <eranian@google.com>
    Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
    Cc: Ben Gainey <ben.gainey@arm.com>
    Cc: Colin King <colin.king@canonical.com>
    Cc: Darren Hart <dvhart@infradead.org>
    Cc: Jiri Olsa <jolsa@redhat.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Fixes: 598b7c69 ("perf jit: add source line info support")
    Link: http://lkml.kernel.org/r/20171122182541.d25599a3eb1ada3480d142fa@arm.comSigned-off-by: default avatarKim Phillips <kim.phillips@arm.com>
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    ca58d7e6
libjvmti.c 11 KB