diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/com/sk89q/warmroast/ClassMapping.java | 67 | ||||
-rw-r--r-- | src/main/java/com/sk89q/warmroast/DataViewServlet.java | 76 | ||||
-rw-r--r-- | src/main/java/com/sk89q/warmroast/McpMapping.java | 116 | ||||
-rw-r--r-- | src/main/java/com/sk89q/warmroast/RoastOptions.java | 52 | ||||
-rw-r--r-- | src/main/java/com/sk89q/warmroast/StackNode.java | 174 | ||||
-rw-r--r-- | src/main/java/com/sk89q/warmroast/StackTraceNode.java | 96 | ||||
-rw-r--r-- | src/main/java/com/sk89q/warmroast/WarmRoast.java | 335 | ||||
-rw-r--r-- | src/main/resources/www/index.html | 13 | ||||
-rw-r--r-- | src/main/resources/www/style.css | 166 | ||||
-rw-r--r-- | src/main/resources/www/warmroast.js | 43 |
10 files changed, 0 insertions, 1138 deletions
diff --git a/src/main/java/com/sk89q/warmroast/ClassMapping.java b/src/main/java/com/sk89q/warmroast/ClassMapping.java deleted file mode 100644 index ad3f7c0..0000000 --- a/src/main/java/com/sk89q/warmroast/ClassMapping.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -package com.sk89q.warmroast; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ClassMapping { - - private final String obfuscated; - private final String actual; - private final Map<String, List<String>> methods = new HashMap<>(); - - public ClassMapping(String obfuscated, String actual) { - this.obfuscated = obfuscated; - this.actual = actual; - } - - public String getObfuscated() { - return obfuscated; - } - - public String getActual() { - return actual; - } - - public void addMethod(String obfuscated, String actual) { - List<String> m = methods.get(obfuscated); - if (m == null) { - m = new ArrayList<>(); - methods.put(obfuscated, m); - } - m.add(actual); - } - - public List<String> mapMethod(String obfuscated) { - List<String> m = methods.get(obfuscated); - if (m == null) { - return new ArrayList<>(); - } - return m; - } - - @Override - public String toString() { - return getObfuscated() + "->" + getActual(); - } - -} diff --git a/src/main/java/com/sk89q/warmroast/DataViewServlet.java b/src/main/java/com/sk89q/warmroast/DataViewServlet.java deleted file mode 100644 index 205dd3e..0000000 --- a/src/main/java/com/sk89q/warmroast/DataViewServlet.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -package com.sk89q.warmroast; - -import java.io.IOException; -import java.io.PrintWriter; -import java.util.Collection; - -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -public class DataViewServlet extends HttpServlet { - - private static final long serialVersionUID = -2331397310804298286L; - - private final WarmRoast roast; - - public DataViewServlet(WarmRoast roast) { - this.roast = roast; - } - - @Override - protected void doGet(HttpServletRequest request, - HttpServletResponse response) throws ServletException, IOException { - response.setContentType("text/html; charset=utf-8"); - response.setStatus(HttpServletResponse.SC_OK); - - PrintWriter w = response.getWriter(); - w.println("<!DOCTYPE html><html><head><title>WarmRoast</title>"); - w.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"style.css\">"); - w.println("</head><body>"); - w.println("<h1>WarmRoast</h1>"); - w.println("<div class=\"loading\">Downloading snapshot; please wait...</div>"); - w.println("<div class=\"stack\" style=\"display: none\">"); - synchronized (roast) { - Collection<StackNode> nodes = roast.getData().values(); - for (StackNode node : nodes) { - w.println(node.toHtml(roast.getMapping())); - } - if (nodes.size() == 0) { - w.println("<p class=\"no-results\">There are no results. " + - "(Thread filter does not match thread?)</p>"); - } - } - w.println("</div>"); - w.println("<p class=\"legend\">Legend: "); - w.println("<span class=\"matched\">Mapped</span> "); - w.println("<span class=\"multiple-matches\">Multiple Mappings</span> "); - w.println("</p>"); - w.println("<div id=\"overlay\"></div>"); - w.println("<p class=\"footer\">"); - w.println("Icons from <a href=\"http://www.fatcow.com/\">FatCow</a> — "); - w.println("<a href=\"http://github.com/sk89q/warmroast\">github.com/sk89q/warmroast</a></p>"); - w.println("<script src=\"//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js\"></script>"); - w.println("<script src=\"warmroast.js\"></script>"); - w.println("</body></html>"); - } -}
\ No newline at end of file diff --git a/src/main/java/com/sk89q/warmroast/McpMapping.java b/src/main/java/com/sk89q/warmroast/McpMapping.java deleted file mode 100644 index 2e8b681..0000000 --- a/src/main/java/com/sk89q/warmroast/McpMapping.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -package com.sk89q.warmroast; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.apache.commons.io.FileUtils; - -import au.com.bytecode.opencsv.CSVReader; - -public class McpMapping { - - private static final Pattern clPattern = - Pattern.compile("CL: (?<obfuscated>[^ ]+) (?<actual>[^ ]+)"); - private static final Pattern mdPattern = - Pattern.compile("MD: (?<obfuscatedClass>[^ /]+)/(?<obfuscatedMethod>[^ ]+) " + - "[^ ]+ (?<method>[^ ]+) [^ ]+"); - - private final Map<String, ClassMapping> classes = new HashMap<>(); - private final Map<String, String> methods = new HashMap<>(); - - public ClassMapping mapClass(String obfuscated) { - return classes.get(obfuscated); - } - - public void read(File joinedFile, File methodsFile) throws IOException { - try (FileReader r = new FileReader(methodsFile)) { - try (CSVReader reader = new CSVReader(r)) { - List<String[]> entries = reader.readAll(); - processMethodNames(entries); - } - } - - List<String> lines = FileUtils.readLines(joinedFile, "UTF-8"); - processClasses(lines); - processMethods(lines); - } - - public String mapMethodId(String id) { - return methods.get(id); - } - - public String fromMethodId(String id) { - String method = methods.get(id); - if (method == null) { - return id; - } - return method; - } - - private void processMethodNames(List<String[]> entries) { - boolean first = true; - for (String[] entry : entries) { - if (entry.length < 2) { - continue; - } - if (first) { // Header - first = false; - continue; - } - methods.put(entry[0], entry[1]); - } - } - - private void processClasses(List<String> lines) { - for (String line : lines) { - Matcher m = clPattern.matcher(line); - if (m.matches()) { - String obfuscated = m.group("obfuscated"); - String actual = m.group("actual").replace("/", "."); - classes.put(obfuscated, new ClassMapping(obfuscated, actual)); - } - } - } - - private void processMethods(List<String> lines) { - for (String line : lines) { - Matcher m = mdPattern.matcher(line); - if (m.matches()) { - String obfuscatedClass = m.group("obfuscatedClass"); - String obfuscatedMethod = m.group("obfuscatedMethod"); - String method = m.group("method"); - String methodId = method.substring(method.lastIndexOf('/') + 1); - ClassMapping mapping = mapClass(obfuscatedClass); - if (mapping != null) { - mapping.addMethod(obfuscatedMethod, - fromMethodId(methodId)); - } - } - } - } - -} diff --git a/src/main/java/com/sk89q/warmroast/RoastOptions.java b/src/main/java/com/sk89q/warmroast/RoastOptions.java deleted file mode 100644 index e7d2b07..0000000 --- a/src/main/java/com/sk89q/warmroast/RoastOptions.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -package com.sk89q.warmroast; - -import com.beust.jcommander.Parameter; - -public class RoastOptions { - - @Parameter(names = { "-h", "--help" }, help = true) - public boolean help; - - @Parameter(names = { "--bind" }, description = "The address to bind the HTTP server to") - public String bindAddress = "0.0.0.0"; - - @Parameter(names = { "-p", "--port" }, description = "The port to bind the HTTP server to") - public Integer port = 23000; - - @Parameter(names = { "--pid" }, description = "The PID of the VM to attach to") - public Integer pid; - - @Parameter(names = { "--name" }, description = "The name of the VM to attach to") - public String vmName; - - @Parameter(names = { "-t", "--thread" }, description = "Optionally specify a thread to log only") - public String threadName; - - @Parameter(names = { "-m", "--mappings" }, description = "A directory with joined.srg and methods.csv") - public String mappingsDir; - - @Parameter(names = { "--interval" }, description = "The sample rate, in milliseconds") - public Integer interval = 100; - - @Parameter(names = { "--timeout" }, description = "The number of seconds before ceasing sampling (optional)") - public Integer timeout; - -} diff --git a/src/main/java/com/sk89q/warmroast/StackNode.java b/src/main/java/com/sk89q/warmroast/StackNode.java deleted file mode 100644 index 71a4f54..0000000 --- a/src/main/java/com/sk89q/warmroast/StackNode.java +++ /dev/null @@ -1,174 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -package com.sk89q.warmroast; - -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; - -public class StackNode implements Comparable<StackNode> { - - private static final NumberFormat cssDec = NumberFormat.getPercentInstance(Locale.US); - private final String name; - private final Map<String, StackNode> children = new HashMap<>(); - private long totalTime; - - static { - cssDec.setGroupingUsed(false); - cssDec.setMaximumFractionDigits(2); - } - - public StackNode(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public String getNameHtml(McpMapping mapping) { - return escapeHtml(getName()); - } - - public Collection<StackNode> getChildren() { - List<StackNode> list = new ArrayList<>(children.values()); - Collections.sort(list); - return list; - } - - public StackNode getChild(String name) { - StackNode child = children.get(name); - if (child == null) { - child = new StackNode(name); - children.put(name, child); - } - return child; - } - - public StackNode getChild(String className, String methodName) { - StackTraceNode node = new StackTraceNode(className, methodName); - StackNode child = children.get(node.getName()); - if (child == null) { - child = node; - children.put(node.getName(), node); - } - return child; - } - - public long getTotalTime() { - return totalTime; - } - - public void log(long time) { - totalTime += time; - } - - private void log(StackTraceElement[] elements, int skip, long time) { - log(time); - - if (elements.length - skip == 0) { - return; - } - - StackTraceElement bottom = elements[elements.length - (skip + 1)]; - getChild(bottom.getClassName(), bottom.getMethodName()) - .log(elements, skip + 1, time); - } - - public void log(StackTraceElement[] elements, long time) { - log(elements, 0, time); - } - - @Override - public int compareTo(StackNode o) { - return getName().compareTo(o.getName()); - } - - private void writeHtml(StringBuilder builder, McpMapping mapping, long totalTime) { - builder.append("<div class=\"node collapsed\">"); - builder.append("<div class=\"name\">"); - builder.append(getNameHtml(mapping)); - builder.append("<span class=\"percent\">"); - builder - .append(String.format("%.2f", getTotalTime() / (double) totalTime * 100)) - .append("%"); - builder.append("</span>"); - builder.append("<span class=\"time\">"); - builder.append(getTotalTime()).append("ms"); - builder.append("</span>"); - builder.append("<span class=\"bar\">"); - builder.append("<span class=\"bar-inner\" style=\"width:") - .append(formatCssPct(getTotalTime() / (double) totalTime)) - .append("\">"); - builder.append("</span>"); - builder.append("</span>"); - builder.append("</div>"); - builder.append("<ul class=\"children\">"); - for (StackNode child : getChildren()) { - builder.append("<li>"); - child.writeHtml(builder, mapping, totalTime); - builder.append("</li>"); - } - builder.append("</ul>"); - builder.append("</div>"); - } - - public String toHtml(McpMapping mapping) { - StringBuilder builder = new StringBuilder(); - writeHtml(builder, mapping, getTotalTime()); - return builder.toString(); - } - - private void writeString(StringBuilder builder, int indent) { - StringBuilder b = new StringBuilder(); - for (int i = 0; i < indent; i++) { - b.append(" "); - } - String padding = b.toString(); - - for (StackNode child : getChildren()) { - builder.append(padding).append(child.getName()); - builder.append(" "); - builder.append(getTotalTime()).append("ms"); - builder.append("\n"); - child.writeString(builder, indent + 1); - } - } - - @Override - public String toString() { - StringBuilder builder = new StringBuilder(); - writeString(builder, 0); - return builder.toString(); - } - - protected static String formatCssPct(double pct) { - return cssDec.format(pct); - } - - protected static String escapeHtml(String str) { - return str.replace("&", "&").replace("<", "<").replace(">", ">"); - } - -} diff --git a/src/main/java/com/sk89q/warmroast/StackTraceNode.java b/src/main/java/com/sk89q/warmroast/StackTraceNode.java deleted file mode 100644 index 5d751a5..0000000 --- a/src/main/java/com/sk89q/warmroast/StackTraceNode.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -package com.sk89q.warmroast; - -import java.util.List; - -public class StackTraceNode extends StackNode { - - private final String className; - private final String methodName; - - public StackTraceNode(String className, String methodName) { - super(className + "." + methodName + "()"); - this.className = className; - this.methodName = methodName; - } - - public String getClassName() { - return className; - } - - public String getMethodName() { - return methodName; - } - - @Override - public String getNameHtml(McpMapping mapping) { - ClassMapping classMapping = mapping.mapClass(getClassName()); - if (classMapping != null) { - String className = "<span class=\"matched\" title=\"" + - escapeHtml(getClassName()) + "\">" + - escapeHtml(classMapping.getActual()) + "</span>"; - - List<String> actualMethods = classMapping.mapMethod(getMethodName()); - if (actualMethods.size() == 0) { - return className + "." + escapeHtml(getMethodName()) + "()"; - } else if (actualMethods.size() == 1) { - return className + - ".<span class=\"matched\" title=\"" + - escapeHtml(getMethodName()) + "\">" + - escapeHtml(actualMethods.get(0)) + "</span>()"; - } else { - StringBuilder builder = new StringBuilder(); - boolean first = true; - for (String m : actualMethods) { - if (!first) { - builder.append(" "); - } - builder.append(m); - first = false; - } - return className + - ".<span class=\"multiple-matches\" title=\"" + - builder.toString() + "\">" + escapeHtml(getMethodName()) + "</span>()"; - } - } else { - String actualMethod = mapping.mapMethodId(getMethodName()); - if (actualMethod == null) { - return escapeHtml(getClassName()) + "." + escapeHtml(getMethodName()) + "()"; - } else { - return className + - ".<span class=\"matched\" title=\"" + - escapeHtml(getMethodName()) + "\">" + - escapeHtml(actualMethod) + "</span>()"; - } - } - } - - @Override - public int compareTo(StackNode o) { - if (getTotalTime() == o.getTotalTime()) { - return 0; - } else if (getTotalTime()> o.getTotalTime()) { - return -1; - } else { - return 1; - } - } - -} diff --git a/src/main/java/com/sk89q/warmroast/WarmRoast.java b/src/main/java/com/sk89q/warmroast/WarmRoast.java deleted file mode 100644 index 9923cb8..0000000 --- a/src/main/java/com/sk89q/warmroast/WarmRoast.java +++ /dev/null @@ -1,335 +0,0 @@ -/* - * WarmRoast - * Copyright (C) 2013 Albert Pham <http://www.sk89q.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. -*/ - -package com.sk89q.warmroast; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.management.ManagementFactory; -import java.lang.management.ThreadInfo; -import java.lang.management.ThreadMXBean; -import java.net.InetSocketAddress; -import java.util.Collections; -import java.util.Comparator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedMap; -import java.util.Timer; -import java.util.TimerTask; -import java.util.TreeMap; - -import javax.management.MBeanServerConnection; -import javax.management.MalformedObjectNameException; -import javax.management.ObjectName; -import javax.management.remote.JMXConnector; -import javax.management.remote.JMXConnectorFactory; -import javax.management.remote.JMXServiceURL; - -import org.eclipse.jetty.server.Server; -import org.eclipse.jetty.server.handler.HandlerList; -import org.eclipse.jetty.server.handler.ResourceHandler; -import org.eclipse.jetty.servlet.ServletContextHandler; -import org.eclipse.jetty.servlet.ServletHolder; - -import com.beust.jcommander.JCommander; -import com.sun.tools.attach.AgentInitializationException; -import com.sun.tools.attach.AgentLoadException; -import com.sun.tools.attach.AttachNotSupportedException; -import com.sun.tools.attach.VirtualMachine; -import com.sun.tools.attach.VirtualMachineDescriptor; - -public class WarmRoast extends TimerTask { - - private static final String SEPARATOR = - "------------------------------------------------------------------------"; - - private final int interval; - private final VirtualMachine vm; - private final Timer timer = new Timer("Roast Pan", true); - private final McpMapping mapping = new McpMapping(); - private final SortedMap<String, StackNode> nodes = new TreeMap<>(); - private JMXConnector connector; - private MBeanServerConnection mbsc; - private ThreadMXBean threadBean; - private String filterThread; - private long endTime = -1; - - public WarmRoast(VirtualMachine vm, int interval) { - this.vm = vm; - this.interval = interval; - } - - public Map<String, StackNode> getData() { - return nodes; - } - - private StackNode getNode(String name) { - StackNode node = nodes.get(name); - if (node == null) { - node = new StackNode(name); - nodes.put(name, node); - } - return node; - } - - public McpMapping getMapping() { - return mapping; - } - - public String getFilterThread() { - return filterThread; - } - - public void setFilterThread(String filterThread) { - this.filterThread = filterThread; - } - - public long getEndTime() { - return endTime; - } - - public void setEndTime(long l) { - this.endTime = l; - } - - public void connect() - throws IOException, AgentLoadException, AgentInitializationException { - // Load the agent - String connectorAddr = vm.getAgentProperties().getProperty( - "com.sun.management.jmxremote.localConnectorAddress"); - if (connectorAddr == null) { - String agent = vm.getSystemProperties().getProperty("java.home") - + File.separator + "lib" + File.separator - + "management-agent.jar"; - vm.loadAgent(agent); - connectorAddr = vm.getAgentProperties().getProperty( - "com.sun.management.jmxremote.localConnectorAddress"); - } - - // Connect - JMXServiceURL serviceURL = new JMXServiceURL(connectorAddr); - connector = JMXConnectorFactory.connect(serviceURL); - mbsc = connector.getMBeanServerConnection(); - try { - threadBean = getThreadMXBean(); - } catch (MalformedObjectNameException e) { - throw new IOException("Bad MX bean name", e); - } - } - - private ThreadMXBean getThreadMXBean() - throws IOException, MalformedObjectNameException { - ObjectName objName = new ObjectName(ManagementFactory.THREAD_MXBEAN_NAME); - Set<ObjectName> mbeans = mbsc.queryNames(objName, null); - for (ObjectName name : mbeans) { - return ManagementFactory.newPlatformMXBeanProxy( - mbsc, name.toString(), ThreadMXBean.class); - } - throw new IOException("No thread MX bean found"); - } - - @Override - public synchronized void run() { - if (endTime >= 0) { - if (endTime <= System.currentTimeMillis()) { - cancel(); - System.err.println("Sampling has stopped."); - return; - } - } - - ThreadInfo[] threadDumps = threadBean.dumpAllThreads(false, false); - for (ThreadInfo threadInfo : threadDumps) { - String threadName = threadInfo.getThreadName(); - StackTraceElement[] stack = threadInfo.getStackTrace(); - - if (threadName == null || stack == null) { - continue; - } - - if (filterThread != null && !filterThread.equals(threadName)) { - continue; - } - - StackNode node = getNode(threadName); - node.log(stack, interval); - } - } - - public void start(InetSocketAddress address) throws Exception { - timer.scheduleAtFixedRate(this, interval, interval); - - Server server = new Server(address); - - ServletContextHandler context = new ServletContextHandler(); - context.setContextPath("/"); - context.addServlet(new ServletHolder(new DataViewServlet(this)), "/stack"); - - ResourceHandler resources = new ResourceHandler(); - String filesDir = WarmRoast.class.getResource("/www").toExternalForm(); - resources.setResourceBase(filesDir); - resources.setDirectoriesListed(true); - resources.setWelcomeFiles(new String[]{ "index.html" }); - - HandlerList handlers = new HandlerList(); - handlers.addHandler(context); - handlers.addHandler(resources); - server.setHandler(handlers); - - server.start(); - server.join(); - } - - public static void main(String[] args) throws AgentLoadException { - RoastOptions opt = new RoastOptions(); - JCommander jc = new JCommander(opt, args); - jc.setProgramName("warmroast"); - - if (opt.help) { - jc.usage(); - System.exit(0); - } - - System.err.println(SEPARATOR); - System.err.println("WarmRoast"); - System.err.println("http://github.com/sk89q/warmroast"); - System.err.println(SEPARATOR); - System.err.println(""); - - VirtualMachine vm = null; - - if (opt.pid != null) { - try { - vm = VirtualMachine.attach(String.valueOf(opt.pid)); - System.err.println("Attaching to PID " + opt.pid + "..."); - } catch (AttachNotSupportedException | IOException e) { - System.err.println("Failed to attach VM by PID " + opt.pid); - e.printStackTrace(); - System.exit(1); - } - } else if (opt.vmName != null) { - for (VirtualMachineDescriptor desc : VirtualMachine.list()) { - if (desc.displayName().contains(opt.vmName)) { - try { - vm = VirtualMachine.attach(desc); - System.err.println("Attaching to '" + desc.displayName() + "'..."); - - break; - } catch (AttachNotSupportedException | IOException e) { - System.err.println("Failed to attach VM by name '" + opt.vmName + "'"); - e.printStackTrace(); - System.exit(1); - } - } - } - } - - if (vm == null) { - List<VirtualMachineDescriptor> descriptors = VirtualMachine.list(); - System.err.println("Choose a VM:"); - - Collections.sort(descriptors, new Comparator<VirtualMachineDescriptor>() { - @Override - public int compare(VirtualMachineDescriptor o1, - VirtualMachineDescriptor o2) { - return o1.displayName().compareTo(o2.displayName()); - } - }); - - // Print list of VMs - int i = 1; - for (VirtualMachineDescriptor desc : descriptors) { - System.err.println("[" + (i++) + "] " + desc.displayName()); - } - - // Ask for choice - System.err.println(""); - System.err.print("Enter choice #: "); - BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); - String s; - try { - s = reader.readLine(); - } catch (IOException e) { - return; - } - - // Get the VM - try { - int choice = Integer.parseInt(s) - 1; - if (choice < 0 || choice >= descriptors.size()) { - System.err.println(""); - System.err.println("Given choice is out of range."); - System.exit(1); - } - vm = VirtualMachine.attach(descriptors.get(choice)); - } catch (NumberFormatException e) { - System.err.println(""); - System.err.println("That's not a number. Bye."); - System.exit(1); - } catch (AttachNotSupportedException | IOException e) { - System.err.println(""); - System.err.println("Failed to attach VM"); - e.printStackTrace(); - System.exit(1); - } - } - - InetSocketAddress address = new InetSocketAddress(opt.bindAddress, opt.port); - - WarmRoast roast = new WarmRoast(vm, opt.interval); - if (opt.mappingsDir != null) { - File dir = new File(opt.mappingsDir); - File joined = new File(dir, "joined.srg"); - File methods = new File(dir, "methods.csv"); - try { - roast.getMapping().read(joined, methods); - } catch (IOException e) { - System.err.println( - "Failed to read the mappings files (joined.srg, methods.csv) " + - "from " + dir.getAbsolutePath() + ": " + e.getMessage()); - System.exit(2); - } - } - - System.err.println(SEPARATOR); - - roast.setFilterThread(opt.threadName); - - if (opt.timeout != null && opt.timeout > 0) { - roast.setEndTime(System.currentTimeMillis() + opt.timeout * 1000); - System.err.println("Sampling set to stop in " + opt.timeout + " seconds."); - } - - System.err.println("Starting a server on " + address.toString() + "..."); - System.err.println("Once the server starts (shortly), visit the URL in your browser."); - System.err.println("Note: The longer you wait before using the output of that " + - "webpage, the more accurate the results will be."); - - try { - roast.connect(); - roast.start(address); - } catch (Throwable t) { - t.printStackTrace(); - System.exit(3); - } - } - -} diff --git a/src/main/resources/www/index.html b/src/main/resources/www/index.html deleted file mode 100644 index 93ecfb4..0000000 --- a/src/main/resources/www/index.html +++ /dev/null @@ -1,13 +0,0 @@ -<!DOCTYPE html><html><head><title>WarmRoast</title> -<style>@import url(style.css);</style> -</head><body> -<h1>WarmRoast</h1> - -<p> - <a href="/stack">View sampler results</a> -</p> - -<p class="footer"> -<a href="http://github.com/sk89q/warmroast">github.com/sk89q/warmroast</a></p> - -</body></html> diff --git a/src/main/resources/www/style.css b/src/main/resources/www/style.css deleted file mode 100644 index 45cfe2d..0000000 --- a/src/main/resources/www/style.css +++ /dev/null @@ -1,166 +0,0 @@ -@import url(http://fonts.googleapis.com/css?family=Lato); - -body { - font-family: 'Lato', Arial, sans-serif; - font-size: 10pt; - line-height: 150%; - margin: 0; - padding: 54px 20px 20px 20px; -} - -ul { - margin: 0; - padding: 0 0 0 18px; -} - -li { - margin: 0; - margin-left: -10px; - padding: 0; - list-style: none; - border-left: 1px solid #ccc; -} - -a:link, a:visited { - color: #FF3213; - text-decoration: none; - border-bottom: 1px solid #CCC; -} - -a:hover, a:active { - color: #000; - border-color: black; - text-decoration: none; -} - -.stack { - margin-left: 60px; -} - -.name { - background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA10lEQVR4Xt2Tu8rCQBSEzzlJmYBvYJ7EShArfQ1BrPNDyoB5DRHsrUQQQc3lcfxBiKbIHjfiCuayKSwEB6ZYPpjdGVhkZvhEJP3dALMMgmB+FoI7ddUQEYhw7bp/48YAkYtOfzCEJu22m5G2gnjeHIYxxHGiXJwV11dQTzdN4w0QKa4JULplGcymkwo4Rkn7iCjNOcNiuVK3vQZ0ug5gWwAgPnpalgW1+yDqA4hQmmSADVVGBW8bES7RaW+zYOBSNSSENL0etAGe5/UkMKBZ/77vv8APfKY7cvZVTt7VqzwAAAAASUVORK5CYII=) center left no-repeat; - padding-left: 20px; - cursor: pointer; -} - -.name:hover { - background-color: #CCC; -} - -.name:hover + ul { - background: #EFEFEF; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); - border-radius: 3px; -} - -.matched { - background: #CCC; - border-radius: 3px; - padding: 0 4px; -} - -.multiple-matches { - background: #FF3213; - color: #FFF; - padding: 0 4px; - border-radius: 3px; -} - -.matched:hover, .multiple-matches:hover { - background: #000000; - color: #FFF; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.4); -} - -.percent { - color: #6b98ff; - font-size: 90%; - border-radius: 3px; - padding: 0 4px; -} - -.bar { - display: inline-block; - width: 100px; - height: 15px; - margin-left: 20px; - border: 1px solid #CCC; - position: absolute; - right: 30px; - background: #FFF; -} - -.bar-inner { - display: inline-block; - height: 16px; - background: #6b98ff; -} - -#overlay span { - position: absolute; - color: #6b98ff; - font-size: 90%; - z-index: 10; - line-height: 150%; - left: 20px; - width: 50px; - text-align: right; -} - -.time { - display: none; - margin: 0; - color: #888; - font-size: 90%; - border-radius: 3px; - padding: 0 4px; -} - -.name:hover .time { - display: inline; -} - -ul { - display: none; -} - -.collapsed > .name { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAA7ElEQVR4Xt1TzYrCQAxOYo8z0GeRZY+eBPGkryGIZ4UeC/Yx/EHvnqTssot/9XF2YUHXQyd2RtuC2OnBg2AgJF/CfJkvwyAzwyNGiT+XwLktBMHwRyl270lDRCDCRb8/aBcSqFi59UYTiuwzXLasEtR18nYbQRTt4f2tqqPGad8uIb2641TyKUSJp307gbH/0wl63U4Ks3y925e/AibOMcN4OofRZKZLOmps6lj2CoBodAohspKUMtePaCcgQqNZCGlw+PFt8nwXWLZE+NttviQrBr6RhoRwOBxXVgLP82pJqECx/fq+n4EX+ExnBI9csQQ1hIoAAAAASUVORK5CYII=); -} - -h1 { - background: #FFF; - color: #111; - position: fixed; - top: 0; - left: 0; - right: 0; - padding: 10px 20px; - margin: 0; - font-size: 14pt; - font-weight: normal; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.4); - z-index: 20; -} - -.footer { - background: #FFF; - color: #333; - margin: 100px 0 0 0; - font-size: 10pt; - font-weight: normal; - text-align: right; -} - -.loading { - font-size: 130%; - background: #EFEFEF; - border: 1px solid #CCC; - padding: 8px; - border-radius: 3px; -} - -.no-results { - font-size: 130%; - color: #800000; -}
\ No newline at end of file diff --git a/src/main/resources/www/warmroast.js b/src/main/resources/www/warmroast.js deleted file mode 100644 index c7dd7bc..0000000 --- a/src/main/resources/www/warmroast.js +++ /dev/null @@ -1,43 +0,0 @@ -$(".name").on("click", function(event) { - var $parent = $(this).parent(); - if ($parent.hasClass("collapsed")) { - $parent.removeClass("collapsed"); - $parent.children("ul").slideDown(50); - } else { - $parent.addClass("collapsed"); - $parent.children("ul").slideUp(50); - } -}); - -function extractTime($el) { - var text = $el.children(".name") - .children(".time").text().replace(/[^0-9]/, ""); - return parseInt(text); -} - -var $overlay = $("#overlay"); - -$(".name").on("mouseenter", function(event) { - var $this = $(this); - var thisTime = null; - $overlay.empty(); - $this.parents(".node").each(function(i, parent) { - var $parent = $(parent); - var time = extractTime($parent); - if (thisTime == null) { - thisTime = time; - } else { - var $el = $(document.createElement("span")); - var pos = $parent.position(); - var width = $el.outerWidth(); - $el.text(((thisTime / time) * 100).toFixed(2) + "%"); - $el.css({ - top: pos.top + "px" - }); - $overlay.append($el); - } - }); -}); - -$(".loading").hide(); -$(".stack").show();
\ No newline at end of file |