/* * Copyright (c) 2013-2016 Chris Newland. * Licensed under https://github.com/AdoptOpenJDK/jitwatch/blob/master/LICENSE-BSD * Instructions: https://github.com/AdoptOpenJDK/jitwatch/wiki */ package org.adoptopenjdk.jitwatch.test; import static org.junit.Assert.assertEquals; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import org.adoptopenjdk.jitwatch.core.JITWatchConstants; import org.adoptopenjdk.jitwatch.model.SplitLog; import org.adoptopenjdk.jitwatch.parser.ILogParser; import org.adoptopenjdk.jitwatch.parser.hotspot.HotSpotLogParser; import org.junit.Test; public class TestLogSplitting { @Test public void testCanParseAssemblyAndNMethodMangled() throws Exception { String nmethodTag = "<nmethod compile_id='999' compiler='C1' level='3' entry='0x00007fb5ad0fe420' size='2504' address='0x0000aaaaaaaaa' relocation_offset='288' method='java/lang/String hashCode ()I' />"; String[] lines = new String[] { "<task_queued compile_id='1' method='java/lang/String length ()I' bytes='55' count='520' backedge_count='5000' iicount='520' stamp='0.083' comment='count' hot_count='520'/>", "<nmethod compile_id='1' compiler='C1' level='3' entry='0x00007fb5ad0fe420' size='2504' address='0x00007fb5ad0fe290' relocation_offset='288' method='java/lang/String length ()I' />", "<task compile_id='1' method='java/lang/String length ()I' bytes='55' count='521' backedge_count='5000' iicount='521' stamp='0.083'>", "<task_done success='1' nmsize='376' count='546' backedge_count='5389' stamp='0.105'/>", "[Loaded java.lang.String from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "Decoding compiled method 0x00007fb5ad0fe290:", "Code:", "[Disassembling for mach='i386:x86-64']", "[Entry Point]", "[Verified Entry Point]", "[Constants]", " # {method} 'length' '()I' in 'java/lang/String'", " 0x00007f7d733642e0: callq 0x00007f7d77e276f0 ; {runtime_call}", "[Deopt Handler Code]", "0x00007fb5ad0fe95c: movabs $0x7fb5ad0fe95c,%r10 ; {section_word}", "0x00007fb5ad0fe966: push %r10", "0x00007fb5ad0fe968: jmpq 0x00007fb5ad047100 ; {runtime_call}", "0x00007fb5ad0fe96d: hlt", "0x00007fb5ad0fe96e: hlt", "0x00007fb5ad0fe96f: hlt " + nmethodTag, "<writer thread='140418643298048'/>" }; Path path = writeLinesToTempFileAndReturnPath(lines); ILogParser parser = new HotSpotLogParser(UnitTestUtil.getNoOpJITListener()); parser.processLogFile(path.toFile(), UnitTestUtil.getNoOpParseErrorListener()); SplitLog log = parser.getSplitLog(); assertEquals(15, log.getAssemblyLines().size()); assertEquals(6, log.getCompilationLines().size()); } private Path writeLinesToTempFileAndReturnPath(String[] lines) throws IOException { StringBuilder builder = new StringBuilder(); for (String line : lines) { builder.append(line).append(JITWatchConstants.S_NEWLINE); } Path path = Files.createTempFile("testsplit", ".log"); Files.write(path, builder.toString().getBytes(StandardCharsets.UTF_8)); return path; } @Test public void testHeaderXMLTextNodes() throws IOException { String[] lines = new String[] { "<?xml version='1.0' encoding='UTF-8'?>", "<hotspot_log version='160 1' process='6868' time_ms='1412577606738'>", "<vm_version>", "<TweakVM/>", "<name>", "Java HotSpot(TM) 64-Bit Server VM", "</name>", "<release>", "1.9.0-ea-b32", "</release>", "<info>", "Java HotSpot(TM) 64-Bit Server VM (1.9.0-ea-b32) for linux-amd64 JRE (1.9.0-ea-b32), built on Sep 25 2014 00:27:31 by "java_re" with ", "gcc 4.8.2", "</info>", "</vm_version>", "<vm_arguments>", "<args>", "-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:-TieredCompilation -XX:+PrintAssembly -XX:-UseCompressedOops ", "</args>", "<command>", "org.adoptopenjdk.jitwatch.demo.MakeHotSpotLog", "</command>", "<launcher>", "SUN_STANDARD", "</launcher>", "<properties>", "java.vm.specification.name=Java Virtual Machine Specification", "java.vm.version=1.9.0-ea-b32", "java.vm.name=Java HotSpot(TM) 64-Bit Server VM", "java.vm.info=mixed mode, sharing", "java.ext.dirs=/home/chris/jdk1.9.0/jre/lib/ext:/usr/java/packages/lib/ext", "java.endorsed.dirs=/home/chris/jdk1.9.0/jre/lib/endorsed", "sun.boot.library.path=/home/chris/jdk1.9.0/jre/lib/amd64", "java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib", "java.home=/home/chris/jdk1.9.0/jre", "java.class.path=target/classes:lib/logback-classic-1.1.2.jar:lib/logback-core-1.1.2.jar:lib/slf4j-api-1.7.7.jar", "sun.boot.class.path=/home/chris/jdk1.9.0/jre/lib/resources.jar:/home/chris/jdk1.9.0/jre/lib/rt.jar:/home/chris/jdk1.9.0/jre/lib/jsse.jar:/home/", "chris/jdk1.9.0/jre/lib/jce.jar:/home/chris/jdk1.9.0/jre/lib/charsets.jar:/home/chris/jdk1.9.0/jre/lib/jfr.jar:/home/chris/jdk1.9.0/jre/classes", "java.vm.specification.vendor=Oracle Corporation", "java.vm.specification.version=1.9", "java.vm.vendor=Oracle Corporation", "sun.java.command=org.adoptopenjdk.jitwatch.demo.MakeHotSpotLog", "sun.java.launcher=SUN_STANDARD", "</properties>", "</vm_arguments>", "<tty>", "<writer thread='139788786714368'/>", "[Opened /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.Object from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.io.Serializable from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.Comparable from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.CharSequence from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.String from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.reflect.AnnotatedElement from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.reflect.GenericDeclaration from /home/chris/jdk1.9.0/jre/lib/rt.jar]", "[Loaded java.lang.reflect.Type from /home/chris/jdk1.9.0/jre/lib/rt.jar]" }; Path path = writeLinesToTempFileAndReturnPath(lines); ILogParser parser = new HotSpotLogParser(UnitTestUtil.getNoOpJITListener()); parser.processLogFile(path.toFile(), UnitTestUtil.getNoOpParseErrorListener()); SplitLog log = parser.getSplitLog(); assertEquals(45, log.getHeaderLines().size()); // <tty> not counted as it envelopes the main XML assertEquals(1, log.getCompilationLines().size()); assertEquals(8, log.getClassLoaderLines().size()); assertEquals("org.adoptopenjdk.jitwatch.demo.MakeHotSpotLog", parser.getVMCommand()); } @Test public void testInitMethodInAssemblyNotIdentifiedAsLogCompilation() throws IOException, ClassNotFoundException { String[] lines = new String[] { "<?xml version='1.0' encoding='UTF-8'?>", "<hotspot_log version='160 1' process='6868' time_ms='1412577606738'>", "<vm_version>", "<TweakVM/>", "<name>", "Java HotSpot(TM) 64-Bit Server VM", "</name>", "<release>", "1.9.0-ea-b32", "</release>", "<info>", "Java HotSpot(TM) 64-Bit Server VM (1.9.0-ea-b32) for linux-amd64 JRE(1.9.0-ea-b32), built on Sep 25 2014 00:27:31 by "java_re" with ", "gcc 4.8.2", "</info>", "</vm_version>", "<vm_arguments>", "<args>", "-XX:+UnlockDiagnosticVMOptions -XX:+TraceClassLoading -XX:+LogCompilation -XX:-TieredCompilation -XX:+PrintAssembly -XX:-UseCompressedOops ", "</args>", "<command>", "org.adoptopenjdk.jitwatch.demo.MakeHotSpotLog", "</command>", "<launcher>", "SUN_STANDARD", "</launcher>", "<properties>", "java.vm.specification.name=Java Virtual Machine Specification", "java.vm.version=1.9.0-ea-b32", "java.vm.name=Java HotSpot(TM) 64-Bit Server VM", "java.vm.info=mixed mode, sharing", "java.ext.dirs=/home/chris/jdk1.9.0/jre/lib/ext:/usr/java/packages/lib/ext", "java.endorsed.dirs=/home/chris/jdk1.9.0/jre/lib/endorsed", "sun.boot.library.path=/home/chris/jdk1.9.0/jre/lib/amd64", "java.library.path=/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib", "java.home=/home/chris/jdk1.9.0/jre", "java.class.path=target/classes:lib/logback-classic-1.1.2.jar:lib/logback-core-1.1.2.jar:lib/slf4j-api-1.7.7.jar", "sun.boot.class.path=/home/chris/jdk1.9.0/jre/lib/resources.jar:/home/chris/jdk1.9.0/jre/lib/rt.jar:/home/chris/jdk1.9.0/jre/lib/jsse.jar:/home/", "chris/jdk1.9.0/jre/lib/jce.jar:/home/chris/jdk1.9.0/jre/lib/charsets.jar:/home/chris/jdk1.9.0/jre/lib/jfr.jar:/home/chris/jdk1.9.0/jre/classes", "java.vm.specification.vendor=Oracle Corporation", "java.vm.specification.version=1.9", "java.vm.vendor=Oracle Corporation", "sun.java.command=org.adoptopenjdk.jitwatch.demo.MakeHotSpotLog", "sun.java.launcher=SUN_STANDARD", "</properties>", "</vm_arguments>", "<tty>", "<writer thread='3'/>", "<nmethod compile_id='236' compiler='C2' entry='0x0000000105a44ce0' size='736' address='0x0000000105a44b90' relocation_offset='296' insts_offset='336' stub_offset='464' scopes_data_offset='504' scopes_pcs_offset='552' dependencies_offset='712' nul_chk_table_offset='720' method='java/lang/String <init> ()V' bytes='26' count='5047' backedge_count='1' iicount='10047' stamp='3.560'/>", "<writer thread='1'/>", "Decoding compiled method 0x0000000105a44850:", "Code:", "[Entry Point]", "[Constants]", " # {method} {0x000000012a1adc08} '", "<writer thread='2'/>", "[Loaded org.eclipse.emf.common.util.DelegatingResourceLocator from file:/Users/chris/eclipse/plugins/org.eclipse.emf.common_2.10.0.v20140514-1158.jar]", "<writer thread='1'/>", "<init>' '()V' in 'java/lang/String'", "--", "[Stub Code]", " 0x0000000105a44a20: jmpq 0x00000001059801a0 ; {no_reloc}", "[Deopt Handler Code]" }; Path path = writeLinesToTempFileAndReturnPath(lines); ILogParser parser = new HotSpotLogParser(UnitTestUtil.getNoOpJITListener()); parser.processLogFile(path.toFile(), UnitTestUtil.getNoOpParseErrorListener()); SplitLog log = parser.getSplitLog(); assertEquals(45, log.getHeaderLines().size()); assertEquals(1, log.getClassLoaderLines().size()); assertEquals(10, log.getAssemblyLines().size()); assertEquals(5, log.getCompilationLines().size()); } }