├── README.md └── TraceReader ├── .DS_Store ├── .classpath ├── .project ├── .settings └── org.eclipse.jdt.core.prefs ├── Tracer.jar ├── bin ├── .DS_Store ├── .gitignore └── com │ ├── .DS_Store │ └── panda │ ├── .DS_Store │ ├── main │ └── Main.class │ ├── trace │ ├── BytesHelper.class │ ├── FormatFile.class │ ├── MethodDes.class │ ├── MethodLog.class │ ├── ThreadList.class │ ├── Trace.class │ ├── TraceAction.class │ ├── TraceFile$TraceFileHeader.class │ ├── TraceFile.class │ ├── TraceRecord.class │ └── TraceThread.class │ ├── ui │ ├── MethodTableModel.class │ ├── TraceFrame$1.class │ ├── TraceFrame$2.class │ ├── TraceFrame.class │ ├── combo │ │ ├── OrderComboBox$1.class │ │ ├── OrderComboBox$2.class │ │ └── OrderComboBox.class │ ├── drop │ │ └── DropTargetAdapterExt.class │ ├── list │ │ ├── ThreadJListModel.class │ │ ├── ThreadListExt.class │ │ └── ThreadMouseAdapter.class │ ├── menu │ │ ├── ThreadListPopupMenu$1.class │ │ ├── ThreadListPopupMenu$2.class │ │ ├── ThreadListPopupMenu.class │ │ ├── TraceMenuBar$1.class │ │ ├── TraceMenuBar$2.class │ │ ├── TraceMenuBar$3.class │ │ ├── TraceMenuBar.class │ │ ├── TreePopupMenu$1.class │ │ ├── TreePopupMenu$2.class │ │ ├── TreePopupMenu$3.class │ │ ├── TreePopupMenu$4.class │ │ ├── TreePopupMenu$5.class │ │ ├── TreePopupMenu$Change.class │ │ └── TreePopupMenu.class │ ├── textfield │ │ ├── FilterTextField$1.class │ │ └── FilterTextField.class │ └── tree │ │ ├── AbstractNode.class │ │ ├── CallStackModel.class │ │ ├── CallStackNode.class │ │ ├── CallStackRender.class │ │ ├── CallStackTree$1.class │ │ ├── CallStackTree.class │ │ ├── ExtendTreeKeyAdapter.class │ │ ├── ExtendTreeMouseAdapter.class │ │ ├── MethodNode.class │ │ ├── MethodRenderer.class │ │ ├── MethodsExtendModel.class │ │ └── MethodsExtendTree.class │ └── util │ └── MethodUtil.class ├── src ├── .DS_Store └── com │ ├── .DS_Store │ └── panda │ ├── .DS_Store │ ├── main │ └── Main.java │ ├── trace │ ├── .DS_Store │ ├── BytesHelper.java │ ├── FormatFile.java │ ├── MethodDes.java │ ├── MethodLog.java │ ├── ThreadList.java │ ├── Trace.java │ ├── TraceAction.java │ ├── TraceFile.java │ ├── TraceRecord.java │ └── TraceThread.java │ ├── ui │ ├── .DS_Store │ ├── MethodTableModel.java │ ├── TraceFrame.java │ ├── combo │ │ └── OrderComboBox.java │ ├── drop │ │ └── DropTargetAdapterExt.java │ ├── list │ │ ├── ThreadJListModel.java │ │ ├── ThreadListExt.java │ │ └── ThreadMouseAdapter.java │ ├── menu │ │ ├── ThreadListPopupMenu.java │ │ ├── TraceMenuBar.java │ │ └── TreePopupMenu.java │ ├── textfield │ │ └── FilterTextField.java │ └── tree │ │ ├── AbstractNode.java │ │ ├── CallStackModel.java │ │ ├── CallStackNode.java │ │ ├── CallStackRender.java │ │ ├── CallStackTree.java │ │ ├── ExtendTreeKeyAdapter.java │ │ ├── ExtendTreeMouseAdapter.java │ │ ├── MethodNode.java │ │ ├── MethodRenderer.java │ │ ├── MethodsExtendModel.java │ │ └── MethodsExtendTree.java │ └── util │ └── MethodUtil.java └── test.trace /README.md: -------------------------------------------------------------------------------- 1 | # TraceReader 2 | ## 1.简述 3 | Android 调试工具ddms的devices栏目存在一个功能叫做start method profiling,此按钮顾名思义是启动method profiling的,而Android的Method Profiling功能,是可以在一段时间内记录所有运行过的函数,最后生成一个xxx.trace文件。xxx.trace文件比较有趣,如果分析andorid源码可以知道,xxx.trace文件按线程和时间记录了method的enter和exit事件。也就是说,如果我们能够读取xxx.trace文件,那么我们就能够获取到某段时间,某个app运行过的java函数。
4 | ## 2.功能 5 |  于是乎,便有个这个工具,目前更新到TraceReader v1.1,实现了如下功能:
6 | 1)支持拖拽解析xx.trace。
7 | ![image](http://123.207.98.15:8080/image/9.png)
8 | 2)支持显示线程。
9 | ![image](http://123.207.98.15:8080/image/10.png)
10 | 3)支持树形显示方法调用
11 | ![image](http://123.207.98.15:8080/image/13.png)
12 | 4)支持按列显示运行方法
13 | ![image](http://123.207.98.15:8080/image/22.png)
14 | 5)支持搜索
15 | ![image](http://123.207.98.15:8080/image/10.png)
16 | 6)支持复制、重命名
17 | ![image](http://123.207.98.15:8080/image/16.png)
18 | ![image](http://123.207.98.15:8080/image/17.png)
19 | 7)支持显示调用时间
20 | ![image](http://123.207.98.15:8080/image/18.png)
21 | ![image](http://123.207.98.15:8080/image/19.png)
22 | ## 3.用法 23 |  解析trace文件,用法如下: 24 | ```Java 25 | byte[] bytes=BytesHelper.toByteArray(fl.getPath()); 26 | Trace trace=new Trace(bytes); 27 | trace.getThreadList(); 28 | ``` 29 | ## 3.原理 30 | TODO…. 31 | 32 | -------------------------------------------------------------------------------- /TraceReader/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/.DS_Store -------------------------------------------------------------------------------- /TraceReader/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /TraceReader/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | TraceReader 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /TraceReader/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.7 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.7 12 | -------------------------------------------------------------------------------- /TraceReader/Tracer.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/Tracer.jar -------------------------------------------------------------------------------- /TraceReader/bin/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/.DS_Store -------------------------------------------------------------------------------- /TraceReader/bin/.gitignore: -------------------------------------------------------------------------------- 1 | /.DS_Store 2 | /com/ 3 | -------------------------------------------------------------------------------- /TraceReader/bin/com/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/.DS_Store -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/.DS_Store -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/main/Main.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/main/Main.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/BytesHelper.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/BytesHelper.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/FormatFile.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/FormatFile.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/MethodDes.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/MethodDes.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/MethodLog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/MethodLog.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/ThreadList.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/ThreadList.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/Trace.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/Trace.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/TraceAction.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/TraceAction.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/TraceFile$TraceFileHeader.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/TraceFile$TraceFileHeader.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/TraceFile.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/TraceFile.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/TraceRecord.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/TraceRecord.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/trace/TraceThread.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/trace/TraceThread.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/MethodTableModel.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/MethodTableModel.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/TraceFrame$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/TraceFrame$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/TraceFrame$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/TraceFrame$2.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/TraceFrame.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/TraceFrame.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/combo/OrderComboBox$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/combo/OrderComboBox$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/combo/OrderComboBox$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/combo/OrderComboBox$2.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/combo/OrderComboBox.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/combo/OrderComboBox.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/drop/DropTargetAdapterExt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/drop/DropTargetAdapterExt.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/list/ThreadJListModel.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/list/ThreadJListModel.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/list/ThreadListExt.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/list/ThreadListExt.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/list/ThreadMouseAdapter.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/list/ThreadMouseAdapter.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/ThreadListPopupMenu$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/ThreadListPopupMenu$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/ThreadListPopupMenu$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/ThreadListPopupMenu$2.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/ThreadListPopupMenu.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/ThreadListPopupMenu.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TraceMenuBar$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TraceMenuBar$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TraceMenuBar$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TraceMenuBar$2.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TraceMenuBar$3.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TraceMenuBar$3.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TraceMenuBar.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TraceMenuBar.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu$2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu$2.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu$3.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu$3.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu$4.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu$4.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu$5.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu$5.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu$Change.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu$Change.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/menu/TreePopupMenu.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/menu/TreePopupMenu.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/textfield/FilterTextField$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/textfield/FilterTextField$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/textfield/FilterTextField.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/textfield/FilterTextField.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/AbstractNode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/AbstractNode.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/CallStackModel.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/CallStackModel.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/CallStackNode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/CallStackNode.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/CallStackRender.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/CallStackRender.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/CallStackTree$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/CallStackTree$1.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/CallStackTree.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/CallStackTree.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/ExtendTreeKeyAdapter.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/ExtendTreeKeyAdapter.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/ExtendTreeMouseAdapter.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/ExtendTreeMouseAdapter.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/MethodNode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/MethodNode.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/MethodRenderer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/MethodRenderer.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/MethodsExtendModel.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/MethodsExtendModel.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/ui/tree/MethodsExtendTree.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/ui/tree/MethodsExtendTree.class -------------------------------------------------------------------------------- /TraceReader/bin/com/panda/util/MethodUtil.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/bin/com/panda/util/MethodUtil.class -------------------------------------------------------------------------------- /TraceReader/src/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/src/.DS_Store -------------------------------------------------------------------------------- /TraceReader/src/com/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/src/com/.DS_Store -------------------------------------------------------------------------------- /TraceReader/src/com/panda/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/src/com/panda/.DS_Store -------------------------------------------------------------------------------- /TraceReader/src/com/panda/main/Main.java: -------------------------------------------------------------------------------- 1 | package com.panda.main; 2 | 3 | import java.io.File; 4 | import java.io.IOException; 5 | import java.util.List; 6 | import java.util.Set; 7 | 8 | import com.panda.trace.MethodLog; 9 | import com.panda.ui.TraceFrame; 10 | 11 | public class Main { 12 | 13 | public static void main(String[] args) throws Exception { 14 | // TODO Auto-generated method stub 15 | TraceFrame fm=new TraceFrame(); 16 | 17 | //System.out.print(fl.length()) 18 | // byte[] bytes=BytesHelper.toByteArray("./test.trace"); 19 | // Trace trace=new Trace(bytes); 20 | // Threads srm=new Threads(trace); 21 | // MethodLog toplevel=TraceThread.topMethod; 22 | // for(MethodLog m:toplevel.child){ 23 | // //d(m); 24 | // if(m.record.threadId==1){ 25 | // System.out.println(m.FullName+" "+toplevel.child.size()); 26 | // printChild(m); 27 | // //System.out.println("==========================================="); 28 | // } 29 | // } 30 | // for (String key : srm.threads.keySet()) { 31 | // System.out.println(srm.threads.get(key).threadId+"||"+srm.threads.get(key).methods.size()); 32 | // if(srm.threads.get(key).threadId==3){ 33 | // 34 | // MethodLog toplevel=TraceThread.topMethod; 35 | // for(MethodLog m:toplevel.child){ 36 | // //d(m); 37 | // } 38 | // } 39 | // } 40 | // srm.threads 41 | // for (String key : srm.threads.keySet()) { 42 | // // System.out.println(srm.threads.get(key).threadId+" "+srm.threads.get(key).methods.size()); 43 | // int num=1; 44 | // for(int i=0;i0){ 46 | // //System.out.println("parent:"+srm.threads.get(key).methods.get(i).parent.methodName); 47 | // if(srm.threads.get(key).methods.get(i).action==0) 48 | // System.out.println(srm.threads.get(key).threadId+"\t"+srm.threads.get(key).methods.get(i).methodName); 49 | // } 50 | // num--; 51 | // } 52 | // } 53 | // srm.methods.get(0).methodName; 54 | // System.out.println("threads="+srm.threads.size()); 55 | // for(int i=0;i threads=new HashMap(); 19 | Map methods=new HashMap(); 20 | public Map getMethods() { 21 | return methods; 22 | } 23 | public void setMethods(Map methods) { 24 | this.methods = methods; 25 | } 26 | public String getVersion() { 27 | return version; 28 | } 29 | public void setVersion(String version) { 30 | this.version = version; 31 | } 32 | public int getVersioncode() { 33 | return versioncode; 34 | } 35 | public void setVersioncode(int versioncode) { 36 | this.versioncode = versioncode; 37 | } 38 | public boolean isOverflow() { 39 | return overflow; 40 | } 41 | public void setOverflow(boolean overflow) { 42 | this.overflow = overflow; 43 | } 44 | public String getClock() { 45 | return clock; 46 | } 47 | public void setClock(String clock) { 48 | this.clock = clock; 49 | } 50 | public long getElapsedTime() { 51 | return elapsedTime; 52 | } 53 | public void setElapsedTime(long elapsedTime) { 54 | this.elapsedTime = elapsedTime; 55 | } 56 | public int getMethodNum() { 57 | return methodNum; 58 | } 59 | public void setMethodNum(int methodNum) { 60 | this.methodNum = methodNum; 61 | } 62 | public int getClockCallOverhead() { 63 | return clockCallOverhead; 64 | } 65 | public void setClockCallOverhead(int clockCallOverhead) { 66 | this.clockCallOverhead = clockCallOverhead; 67 | } 68 | public String getVm() { 69 | return vm; 70 | } 71 | public void setVm(String vm) { 72 | this.vm = vm; 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/trace/MethodDes.java: -------------------------------------------------------------------------------- 1 | package com.panda.trace; 2 | 3 | public class MethodDes { 4 | private long method; 5 | private String methodDescriptor; 6 | private String methodName; 7 | private String methodSig; 8 | public String getOldMethodDescriptor() { 9 | return oldMethodDescriptor; 10 | } 11 | public String getOldMethodName() { 12 | return oldMethodName; 13 | } 14 | public String getOldMethodSig() { 15 | return oldMethodSig; 16 | } 17 | private String oldMethodDescriptor; 18 | private String oldMethodName; 19 | private String oldMethodSig; 20 | private String source; 21 | public long getMethod() { 22 | return method; 23 | } 24 | public void setMethod(long method) { 25 | this.method = method; 26 | } 27 | public String getMethodDescriptor() { 28 | return methodDescriptor; 29 | } 30 | public void setMethodDescriptor(String methodDescriptor) { 31 | this.methodDescriptor = methodDescriptor; 32 | this.oldMethodDescriptor=methodDescriptor; 33 | } 34 | public String getMethodSig() { 35 | return methodSig; 36 | } 37 | public void setMethodSig(String methodSig) { 38 | this.methodSig = methodSig; 39 | this.oldMethodSig=methodSig; 40 | } 41 | public String getSource() { 42 | return source; 43 | } 44 | public void setSource(String source) { 45 | this.source = source; 46 | } 47 | public String getMethodName() { 48 | return methodName; 49 | } 50 | public void setMethodName(String methodName) { 51 | this.methodName = methodName; 52 | this.oldMethodName=methodName; 53 | } 54 | public void renameClass(String oldCls,String cls){ 55 | this.methodDescriptor=methodDescriptor.replace(oldCls, cls); 56 | } 57 | public void renameSig(String oldCls,String cls){ 58 | this.methodSig=methodSig.replace(oldCls, cls); 59 | } 60 | public void renameMethod(String method){ 61 | this.methodName=method; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/trace/MethodLog.java: -------------------------------------------------------------------------------- 1 | package com.panda.trace; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | public class MethodLog implements Comparable{ 7 | TraceRecord record; 8 | long threadCostTime; 9 | public long getThreadCostTime() { 10 | return threadCostTime; 11 | } 12 | public void setThreadCostTime(long threadCostTime) { 13 | this.threadCostTime = threadCostTime; 14 | } 15 | public long getWallCostTime() { 16 | return wallCostTime; 17 | } 18 | public void setWallCostTime(long wallCostTime) { 19 | this.wallCostTime = wallCostTime; 20 | } 21 | long wallCostTime; 22 | public TraceRecord getRecord() { 23 | return record; 24 | } 25 | public String getFullName() { 26 | return record.m.getMethodDescriptor()+"."+record.m.getMethodName()+record.m.getMethodSig(); 27 | } 28 | public String getOriginFullName() { 29 | return record.m.getOldMethodDescriptor()+"."+record.m.getOldMethodName()+record.m.getOldMethodSig(); 30 | } 31 | // public void setFullName(String fullName) { 32 | // FullName = fullName; 33 | // } 34 | public String getMethodName() { 35 | return record.m.getMethodName(); 36 | } 37 | // public void setMethodName(String methodName) { 38 | // this.methodName = methodName; 39 | // } 40 | public String getSource() { 41 | return record.m.getSource().split("\t")[0]; 42 | } 43 | // public void setSource(String source) { 44 | // this.source = source; 45 | // } 46 | public int getAction() { 47 | return record.action; 48 | } 49 | // public void setAction(int action) { 50 | // this.action = action; 51 | // } 52 | public MethodLog getParent() { 53 | return parent; 54 | } 55 | public void setParent(MethodLog parent) { 56 | this.parent = parent; 57 | } 58 | public MethodLog getPartner() { 59 | return partner; 60 | } 61 | public void setPartner(MethodLog partner) { 62 | this.partner = partner; 63 | } 64 | public List getChild() { 65 | return child; 66 | } 67 | public void setChild(List child) { 68 | this.child = child; 69 | } 70 | MethodLog parent; 71 | MethodLog partner; 72 | List child=new ArrayList<>(); 73 | public MethodLog(){} 74 | public MethodLog(String name){ 75 | this.parent=null; 76 | this.record=new TraceRecord(); 77 | this.record.m=new MethodDes(); 78 | this.record.m.setMethodDescriptor(""); 79 | this.record.m.setMethodName(name); 80 | this.record.m.setMethodSig(""); 81 | this.record.m.setSource("unknown");; 82 | this.record.action=3; 83 | } 84 | public MethodLog(TraceRecord r){ 85 | this.record = r; 86 | 87 | } 88 | public MethodLog(String name,int action){ 89 | this.parent=null; 90 | // this.methodName=name; 91 | // this.FullName=name; 92 | // this.source="unknown"; 93 | // this.action=action; 94 | this.record=new TraceRecord(); 95 | this.record.m=new MethodDes(); 96 | this.record.m.setMethodDescriptor(""); 97 | this.record.m.setMethodName(name); 98 | this.record.m.setMethodSig(""); 99 | this.record.m.setSource("unknown");; 100 | this.record.action=action; 101 | 102 | } 103 | @Override 104 | public int compareTo(Object o) { 105 | // TODO Auto-generated method stub 106 | if(!(o instanceof MethodLog)){ 107 | throw new ClassCastException("Not MethodLog Class!"); 108 | } 109 | MethodLog o1=(MethodLog)o; 110 | return (int) (o1.child.size()-this.child.size()); 111 | } 112 | } 113 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/trace/ThreadList.java: -------------------------------------------------------------------------------- 1 | package com.panda.trace; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.Comparator; 6 | import java.util.HashMap; 7 | import java.util.List; 8 | import java.util.Map; 9 | 10 | public class ThreadList { 11 | public List names; 12 | Map threads; 13 | protected Map nameMap; 14 | boolean sort; 15 | public Map getNameMap() { 16 | return nameMap; 17 | } 18 | public Map getThreads() { 19 | return threads; 20 | } 21 | public void setThreads(Map threads) { 22 | this.threads = threads; 23 | } 24 | @SuppressWarnings("unchecked") 25 | protected ThreadList() throws Throwable{ 26 | names=new ArrayList<>(); 27 | threads=new HashMap<>(); 28 | nameMap=new HashMap<>(); 29 | sort=true; 30 | } 31 | protected void sort(){ 32 | if(sort){ 33 | sort=false; 34 | for (String key : threads.keySet()) { 35 | threads.get(key).sortMethods(); 36 | } 37 | } 38 | } 39 | public List getAllName(){ 40 | List nameList = new ArrayList(); 41 | nameList.addAll(nameMap.keySet()); 42 | return nameList; 43 | } 44 | public void reset(){ 45 | names.clear(); 46 | threads.clear(); 47 | nameMap.clear(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/trace/Trace.java: -------------------------------------------------------------------------------- 1 | package com.panda.trace; 2 | 3 | import java.io.BufferedReader; 4 | import java.util.ArrayList; 5 | import java.util.HashMap; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | //File format: 10 | //header 11 | //record 0 12 | //record 1 13 | //... 14 | // 15 | //Header format: 16 | //u4 magic ('SLOW') 17 | //u2 version 18 | //u2 offset to data 19 | //u8 start date/time in usec 20 | //u2 record size in bytes (version >= 2 only) 21 | //... padding to 32 bytes 22 | // 23 | //Record format v1: 24 | //u1 thread ID 25 | //u4 method ID | method action 26 | //u4 time delta since start, in usec 27 | // 28 | //Record format v2: 29 | //u2 thread ID 30 | //u4 method ID | method action 31 | //u4 time delta since start, in usec 32 | // 33 | //Record format v3: 34 | //u2 thread ID 35 | //u4 method ID | method action 36 | //u4 time delta since start, in usec 37 | //u4 wall time since start, in usec (when clock == "dual" only) 38 | // 39 | //32 bits of microseconds is 70 minutes. 40 | // 41 | //All values are stored in little-endian order. 42 | //copy from android 4.4 43 | public class Trace { 44 | FormatFile fmFile; 45 | TraceFile traceFile; 46 | ThreadList thread; 47 | public ThreadList getThreadList() { 48 | return thread; 49 | } 50 | // Map threads=new HashMap<>(); 51 | // protected List names=new ArrayList<>(); 52 | // protected Map> nameMap=new HashMap<>(); 53 | public Trace(byte[] bytes){ 54 | divideBytes(bytes); 55 | } 56 | private void readTrace(byte[] data)throws Throwable{ 57 | ThreadList t=new ThreadList(); 58 | Map threads=t.threads; 59 | List names=t.names; 60 | Map nameMap=t.nameMap; 61 | traceFile=new TraceFile(); 62 | int offset=0; 63 | traceFile.header.kTraceMagicValue=(char)(data[0])+""+(char)(data[1])+""+(char)(data[2])+""+(char)(data[3]); 64 | offset=offset+4; 65 | traceFile.header.trace_version=BytesHelper.read2LE(data, offset); 66 | offset=offset+2; 67 | traceFile.header.kTraceHeaderLength=BytesHelper.read2LE(data, offset); 68 | offset=offset+2; 69 | traceFile.header.start_time_=BytesHelper.read8LE(data, offset); 70 | offset=offset+8; 71 | if(traceFile.header.trace_version>=3){ 72 | traceFile.header.record_size=14; 73 | }else{ 74 | traceFile.header.record_size=10; 75 | } 76 | offset=traceFile.header.kTraceHeaderLength; 77 | long value; 78 | long current=System.currentTimeMillis(); 79 | while(offset=2){ 153 | fmFile.threads.put(params[0], params[1]); 154 | System.out.println(params[0]+" "+params[1]); 155 | }else{ 156 | fmFile.threads.put(params[0], "unknown"); 157 | } 158 | offset++; 159 | } 160 | offset++; 161 | while(!lists[offset].equals("*end")){ 162 | MethodDes m=new MethodDes(); 163 | String params[]=lists[offset].split("\t"); 164 | m.setMethod(Long.parseLong(params[0].replace("0x", ""), 16)); 165 | m.setMethodDescriptor(params[1]); 166 | m.setMethodName(params[2]); 167 | m.setMethodSig(params[3]); 168 | if(params.length==6){ 169 | m.setSource(params[4]+" "+params[5]); 170 | }else{ 171 | m.setSource(params[4]); 172 | } 173 | offset++; 174 | fmFile.methods.put(m.getMethod(), m); 175 | } 176 | } 177 | private void divideBytes(byte[] bytes){ 178 | int padding=0; 179 | for(int i=0;i records=new ArrayList(); 9 | public class TraceFileHeader { 10 | String kTraceMagicValue; 11 | int trace_version; 12 | int kTraceHeaderLength; 13 | long start_time_; 14 | int record_size; 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/trace/TraceRecord.java: -------------------------------------------------------------------------------- 1 | package com.panda.trace; 2 | 3 | public class TraceRecord { 4 | int threadId; 5 | public int getThreadId() { 6 | return threadId; 7 | } 8 | public void setThreadId(int threadId) { 9 | this.threadId = threadId; 10 | } 11 | public long getMethodValue() { 12 | return methodValue; 13 | } 14 | public void setMethodValue(long methodValue) { 15 | this.methodValue = methodValue; 16 | } 17 | public long getThreadClockDiff() { 18 | return threadClockDiff; 19 | } 20 | public void setThreadClockDiff(long threadClockDiff) { 21 | this.threadClockDiff = threadClockDiff; 22 | } 23 | public long getWallClockDiff() { 24 | return wallClockDiff; 25 | } 26 | public void setWallClockDiff(long wallClockDiff) { 27 | this.wallClockDiff = wallClockDiff; 28 | } 29 | long methodValue; 30 | long threadClockDiff; 31 | long wallClockDiff; 32 | MethodDes m; 33 | public MethodDes getM() { 34 | return m; 35 | } 36 | public void setM(MethodDes m) { 37 | this.m = m; 38 | } 39 | int action; 40 | public int getAction() { 41 | return action; 42 | } 43 | public void setAction(int action) { 44 | this.action = action; 45 | } 46 | public void reNameMethod(String name){ 47 | m.renameMethod(name); 48 | } 49 | public void reNameClass(String old,String name){ 50 | m.renameClass(old, name); 51 | m.renameSig("L"+old+";", "L"+name+";"); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/trace/TraceThread.java: -------------------------------------------------------------------------------- 1 | package com.panda.trace; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.Stack; 6 | 7 | public class TraceThread { 8 | int threadId; 9 | public int getThreadId() { 10 | return threadId; 11 | } 12 | public void setThreadId(int threadId) { 13 | this.threadId = threadId; 14 | } 15 | public List getMethods() { 16 | return methods; 17 | } 18 | public void setMethods(List methods) { 19 | this.methods = methods; 20 | } 21 | String name; 22 | public String getName() { 23 | return name; 24 | } 25 | public void setName(String name) { 26 | this.name = name; 27 | } 28 | List methods=new ArrayList<>(); 29 | public final static MethodLog topMethod=new MethodLog("TopMethod"); 30 | public final static MethodLog endMethod=new MethodLog("endMethod"); 31 | public final static MethodLog noPart=new MethodLog("noPart"); 32 | protected void sortMethods(){ 33 | Stack stack=new Stack(); 34 | int n=0; 35 | //stack.push(topMethod); 36 | for(int i=0;i m=new ArrayList(); 78 | for(int i=0;ijsb.getMaximum()*0.9){ 144 | // System.out.println(mModel.getWhere()); 145 | jsb.setValue((int)(jsb.getMaximum()*0.5)); 146 | ((MethodsExtendTree) mTree).reloadMMode(((MethodsExtendModel)mTree.getModel()).getMethods(),((MethodsExtendModel)mTree.getModel()).getWhere(),searchField.getText()); 147 | } 148 | 149 | } 150 | 151 | }); 152 | 153 | tabbedPane.addTab("Trace方法列表", jspMtree); 154 | tabbedPane.addTab("Trace方法集合", new JScrollPane(mtable)); 155 | jspMain.setRightComponent(tabbedPane); 156 | tabbedPane.addChangeListener(new ChangeListener(){ 157 | 158 | @Override 159 | public void stateChanged(ChangeEvent e) { 160 | // TODO Auto-generated method stub 161 | if(tabbedPane.getSelectedIndex()==1){ 162 | ((MethodsExtendTree) mTree).reloadMMode(0,""); 163 | return; 164 | } 165 | } 166 | 167 | }); 168 | 169 | JPanel jp3=new JPanel(); 170 | jp3.setBorder(BorderFactory.createTitledBorder("查 找")); 171 | BorderLayout border3=new BorderLayout(); 172 | jp3.setLayout(border3); 173 | searchField=new FilterTextField(this); 174 | jp3.add(searchField,border3.CENTER); 175 | 176 | jp0.add(jspMain,border0.CENTER); 177 | jp0.add(jp3, border0.SOUTH); 178 | this.getContentPane().add(jp0); 179 | } 180 | public File chooseFile(){ 181 | JFileChooser jfc=new JFileChooser(); 182 | jfc.setFileSelectionMode(JFileChooser.FILES_ONLY ); 183 | jfc.showDialog(new JLabel(), "选择"); 184 | File file=jfc.getSelectedFile(); 185 | return file; 186 | } 187 | public static int getChildNum(MethodLog log){ 188 | int sum=log.getChild().size(); 189 | if(sum==0){ 190 | return sum; 191 | } 192 | for(MethodLog m1:log.getChild()){ 193 | sum=sum+getChildNum(m1); 194 | } 195 | return sum; 196 | } 197 | public void updateUI(){ 198 | threadList.updateUI(); 199 | } 200 | public void extendMethod(String name,String reg){ 201 | ((CallStackTree) callstackTree).setName(name); 202 | ((CallStackTree) callstackTree).extendMethod(reg); 203 | TraceThread thread=traceThreads.getThreads().get(name); 204 | List methods=thread.getMethods(); 205 | ((MethodsExtendModel)mTree.getModel()).setMethods(methods); 206 | if(tabbedPane.getSelectedIndex()==1){ 207 | ((MethodsExtendTree) mTree).reloadMMode(0,reg); 208 | } 209 | } 210 | public void extendMethod(String reg){ 211 | ((CallStackTree) callstackTree).extendMethod(reg); 212 | TraceThread thread=traceThreads.getThreads().get(((CallStackTree) callstackTree).getName()); 213 | List methods=thread.getMethods(); 214 | ((MethodsExtendModel)mTree.getModel()).setMethods(methods); 215 | if(tabbedPane.getSelectedIndex()==1){ 216 | ((MethodsExtendTree) mTree).reloadMMode(0,reg); 217 | } 218 | } 219 | public void evalSearch(String reg){ 220 | if(tabbedPane.getSelectedIndex()==0){ 221 | if(reg=="") 222 | return; 223 | ((CallStackTree) callstackTree).extendTreeMode(reg); 224 | return; 225 | } 226 | if(tabbedPane.getSelectedIndex()==1){ 227 | ((MethodsExtendTree) mTree).reloadMMode(0,reg); 228 | return; 229 | } 230 | } 231 | public void addFilterName(String reg){ 232 | filter=reg; 233 | reloadLabelName(); 234 | if(tabbedPane.getSelectedIndex()==1){ 235 | ((MethodsExtendTree) mTree).reloadMMode(0,""); 236 | }else if(tabbedPane.getSelectedIndex()==0){ 237 | ((CallStackTree) callstackTree).fillTree(reg); 238 | } 239 | } 240 | private void reloadLabelName(){ 241 | mTree.setBorder(BorderFactory.createTitledBorder(getBoderName(1))); 242 | callstackTree.setBorder(BorderFactory.createTitledBorder(getBoderName(0))); 243 | } 244 | public String getBoderName(int i){ 245 | if(i==0){ 246 | return "调用关系<显示字符:"+(filter.equals("")?"all":filter)+",添加hook函数:"+hooks+",重命名:"+renames+">"; 247 | }else if(i==1){ 248 | return "方法列表<显示字符:"+(filter.equals("")?"all":filter)+",添加hook函数:"+hooks+",重命名:"+renames+">"; 249 | }else{ 250 | return "uknown"; 251 | } 252 | } 253 | public synchronized void rename(String origin,String name,String rename){ 254 | Map nameMap=this.getTraceThreads().getNameMap(); 255 | String clsName=name.substring(0, name.indexOf(".")); 256 | String methodName=name.substring(name.indexOf("."),name.indexOf("(")); 257 | String sig=name.substring(name.indexOf("("),name.length()); 258 | String reClsName=rename.substring(0, rename.indexOf(".")); 259 | String reMethodName=rename.substring(rename.indexOf("."),rename.indexOf("(")); 260 | String reSig=rename.substring(rename.indexOf("("),rename.length()); 261 | if(reClsName.equals("")||reMethodName.equals("")||reSig.equals("")){ 262 | JOptionPane.showMessageDialog(this, "改名失败!"); 263 | return; 264 | } 265 | if((!clsName.equals(reClsName)&&!sig.equals(reSig))){ 266 | JOptionPane.showMessageDialog(this, "一次只允许修改一个类!"); 267 | return; 268 | } 269 | if(!methodName.equals(reMethodName)){ 270 | TraceRecord r=nameMap.get(origin); 271 | r.reNameMethod(reMethodName); 272 | } 273 | if(!clsName.equals(reClsName)){ 274 | for(Entry entry :nameMap.entrySet()){ 275 | TraceRecord r=entry.getValue(); 276 | r.reNameClass(clsName,reClsName); 277 | } 278 | }else if(!sig.equals(reSig)){ 279 | String[] str= MethodUtil.anlysisSig(sig).split(";"); 280 | String[] res= MethodUtil.anlysisSig(reSig).split(";"); 281 | if(str.length!=res.length){ 282 | JOptionPane.showMessageDialog(this, "改名失败!"); 283 | return; 284 | } 285 | for(int i=0;i entry :nameMap.entrySet()){ 290 | TraceRecord r=entry.getValue(); 291 | r.reNameClass(str[i],res[i]); 292 | } 293 | } 294 | } 295 | } 296 | renames++; 297 | reloadLabelName(); 298 | } 299 | } 300 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/combo/OrderComboBox.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.combo; 2 | 3 | import java.awt.event.ItemEvent; 4 | import java.awt.event.ItemListener; 5 | import java.util.Collections; 6 | import java.util.Comparator; 7 | 8 | import javax.swing.JComboBox; 9 | 10 | import com.panda.ui.TraceFrame; 11 | 12 | public class OrderComboBox extends JComboBox implements ItemListener{ 13 | static final String LIST[] = {"线程列表", "方法列表"}; 14 | TraceFrame frame; 15 | public OrderComboBox(TraceFrame frame){ 16 | super(LIST); 17 | this.frame=frame; 18 | this.addItemListener(this); 19 | } 20 | @Override 21 | public void itemStateChanged(ItemEvent e) { 22 | // TODO Auto-generated method stub 23 | if(frame.getTraceThreads()==null){ 24 | return; 25 | } 26 | if(this.getSelectedItem().toString().equals("线程列表")){ 27 | // List> list = new ArrayList>(traceThreads.getThreads().entrySet()); 28 | Collections.sort(frame.getTraceThreads().names,new Comparator() { 29 | @Override 30 | public int compare(String o1, String o2) { 31 | // TODO Auto-generated method stub 32 | return o1.compareTo(o2); 33 | } 34 | 35 | }); 36 | if(frame.getTraceThreads()!=null){ 37 | frame.updateUI(); 38 | // model. 39 | } 40 | }else if(this.getSelectedItem().toString().equals("方法列表")){ 41 | //List> list = new ArrayList>(traceThreads.getThreads().entrySet()); 42 | Collections.sort(frame.getTraceThreads().names,new Comparator() { 43 | @Override 44 | public int compare(String o1, String o2) { 45 | // TODO Auto-generated method stub 46 | return frame.getTraceThreads().getThreads().get(o2).getMethods().size()-frame.getTraceThreads().getThreads().get(o1).getMethods().size(); 47 | } 48 | 49 | }); 50 | if(frame.getTraceThreads()!=null){ 51 | frame.updateUI(); 52 | // model. 53 | } 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/drop/DropTargetAdapterExt.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.drop; 2 | 3 | import java.awt.datatransfer.DataFlavor; 4 | import java.awt.datatransfer.Transferable; 5 | import java.awt.dnd.DnDConstants; 6 | import java.awt.dnd.DropTargetAdapter; 7 | import java.awt.dnd.DropTargetDropEvent; 8 | import java.io.File; 9 | import java.util.Iterator; 10 | import java.util.List; 11 | 12 | import javax.swing.JFrame; 13 | import javax.swing.JOptionPane; 14 | 15 | import com.panda.trace.BytesHelper; 16 | import com.panda.trace.ThreadList; 17 | import com.panda.trace.Trace; 18 | import com.panda.trace.TraceThread; 19 | import com.panda.ui.TraceFrame; 20 | 21 | public class DropTargetAdapterExt extends DropTargetAdapter{ 22 | JFrame frame; 23 | public DropTargetAdapterExt(JFrame frame){ 24 | super(); 25 | this.frame=frame; 26 | } 27 | @Override 28 | public void drop(DropTargetDropEvent dtde) { 29 | // TODO Auto-generated method stub 30 | try 31 | { 32 | Transferable tf=dtde.getTransferable(); 33 | if(tf.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) 34 | { 35 | dtde.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE); 36 | List lt=(List)tf.getTransferData(DataFlavor.javaFileListFlavor); 37 | Iterator itor=lt.iterator(); 38 | while(itor.hasNext()) 39 | { 40 | File fl=(File)itor.next(); 41 | if(fl.getName().endsWith(".trace")){ 42 | try { 43 | if(((TraceFrame)frame).getTraceThreads()!=null){ 44 | ((TraceFrame)frame).getTraceThreads().reset(); 45 | } 46 | TraceThread.topMethod.getChild().clear(); 47 | byte[] bytes=BytesHelper.toByteArray(fl.getPath()); 48 | //long current=System.currentTimeMillis(); 49 | Trace trace=new Trace(bytes); 50 | //long current1=System.currentTimeMillis(); 51 | 52 | ((TraceFrame)frame).setTraceThreads(trace.getThreadList()); 53 | long current2=System.currentTimeMillis(); 54 | //System.out.println(current1-current); 55 | //System.out.println(current2-current1); 56 | //threadList. 57 | ((TraceFrame)frame).updateUI();; 58 | 59 | } catch (Exception e1) { 60 | // TODO Auto-generated catch block 61 | e1.printStackTrace(); 62 | JOptionPane.showMessageDialog(null, "解析文件出错!", "提示", JOptionPane.OK_OPTION); 63 | } 64 | }else{ 65 | JOptionPane.showMessageDialog(null, "选中非trace文件!", "提示", JOptionPane.OK_OPTION); 66 | } 67 | // System.out.println(f.getAbsolutePath()); 68 | } 69 | dtde.dropComplete(true); 70 | } 71 | else 72 | { 73 | dtde.rejectDrop(); 74 | } 75 | } 76 | catch(Exception e) 77 | { 78 | e.printStackTrace(); 79 | } 80 | } 81 | 82 | } 83 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/list/ThreadJListModel.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.list; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Collections; 5 | import java.util.Comparator; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | import javax.swing.AbstractListModel; 10 | import javax.swing.JLabel; 11 | import javax.swing.JList; 12 | 13 | import com.panda.trace.ThreadList; 14 | import com.panda.trace.TraceThread; 15 | import com.panda.ui.TraceFrame; 16 | 17 | @SuppressWarnings("serial") 18 | public class ThreadJListModel extends AbstractListModel{ 19 | private TraceFrame trf; 20 | private String filter=""; 21 | public String getFilter() { 22 | return filter; 23 | } 24 | public void setFilter(String filter) { 25 | this.filter = filter; 26 | } 27 | public ThreadJListModel(TraceFrame trf){ 28 | this.trf=trf; 29 | // System.out.println(trf.getTraceThreads().names.size()); 30 | } 31 | @Override 32 | public int getSize() { 33 | // TODO Auto-generated method stub 34 | if(trf.getTraceThreads()==null){ 35 | return 0; 36 | } 37 | return trf.getTraceThreads().names.size(); 38 | } 39 | 40 | @Override 41 | public Object getElementAt(int index) { 42 | // TODO Auto-generated method stub 43 | if(trf.getTraceThreads()==null){ 44 | return null; 45 | } 46 | String name=trf.getTraceThreads().names.get(index)+"\t" 47 | +trf.getTraceThreads().getThreads().get(trf.getTraceThreads().names.get(index)).getName()+"("+ 48 | trf.getTraceThreads().getThreads().get(trf.getTraceThreads().names.get(index)).getMethods().size()+")"; 49 | //JLabel label=new JLabel(name); 50 | return name; 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/list/ThreadListExt.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.list; 2 | 3 | import java.awt.event.MouseAdapter; 4 | import java.awt.event.MouseEvent; 5 | import java.util.List; 6 | 7 | import javax.swing.JList; 8 | 9 | import com.panda.trace.MethodLog; 10 | import com.panda.trace.TraceThread; 11 | import com.panda.ui.TraceFrame; 12 | 13 | public class ThreadListExt extends JList{ 14 | TraceFrame frame; 15 | ThreadJListModel model; 16 | public ThreadListExt(TraceFrame frame){ 17 | this.frame=frame; 18 | model=new ThreadJListModel(frame); 19 | this.setModel(model); 20 | this.addMouseListener(new ThreadMouseAdapter(frame, this)); 21 | } 22 | public String getSelectedName(){ 23 | if(frame.getTraceThreads()==null||frame.getTraceThreads().names==null){ 24 | return ""; 25 | } 26 | return frame.getTraceThreads().names.get(this.getSelectedIndex()); 27 | } 28 | public void deleteSelectedName(String name){ 29 | if(frame.getTraceThreads()==null||frame.getTraceThreads().names==null){ 30 | return ; 31 | } 32 | frame.getTraceThreads().names.remove(name); 33 | this.updateUI(); 34 | return; 35 | } 36 | public void filterToThread(String reg){ 37 | model.setFilter(reg); 38 | frame.addFilterName(reg); 39 | this.updateUI(); 40 | } 41 | public ThreadJListModel getModel(){ 42 | return model; 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/list/ThreadMouseAdapter.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.list; 2 | 3 | import java.awt.Component; 4 | import java.awt.event.MouseAdapter; 5 | import java.awt.event.MouseEvent; 6 | import java.util.List; 7 | 8 | import com.panda.trace.MethodLog; 9 | import com.panda.trace.TraceThread; 10 | import com.panda.ui.TraceFrame; 11 | import com.panda.ui.menu.ThreadListPopupMenu; 12 | 13 | public class ThreadMouseAdapter extends MouseAdapter{ 14 | TraceFrame frame; 15 | ThreadListExt thread; 16 | ThreadListPopupMenu pop; 17 | public ThreadMouseAdapter(TraceFrame frame,ThreadListExt thread){ 18 | this.frame=frame; 19 | this.thread=thread; 20 | pop=new ThreadListPopupMenu(thread); 21 | } 22 | public void mouseClicked(MouseEvent e) { 23 | 24 | // TODO Auto-generated method stub 25 | if(e.getClickCount()==2){ 26 | if(frame.getTraceThreads()==null||frame.getTraceThreads().names==null){ 27 | return; 28 | } 29 | String name=thread.getSelectedName(); 30 | frame.extendMethod(name,thread.getModel().getFilter()); 31 | }else if(e.isMetaDown()){ 32 | Component c=thread.findComponentAt(e.getX(), e.getY()); 33 | pop.setFocus(c); 34 | pop.show(e.getComponent(), e.getX(), e.getY()); 35 | } 36 | 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/menu/ThreadListPopupMenu.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.menu; 2 | 3 | import java.awt.Component; 4 | import java.awt.Toolkit; 5 | import java.awt.datatransfer.Clipboard; 6 | import java.awt.datatransfer.StringSelection; 7 | import java.awt.datatransfer.Transferable; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.awt.event.MouseAdapter; 11 | import java.awt.event.MouseEvent; 12 | 13 | import javax.swing.JMenuItem; 14 | import javax.swing.JOptionPane; 15 | import javax.swing.JPopupMenu; 16 | 17 | import com.panda.ui.TraceFrame; 18 | import com.panda.ui.list.ThreadListExt; 19 | 20 | public class ThreadListPopupMenu extends JPopupMenu{ 21 | ThreadListExt thread; 22 | private JMenuItem copy = null, filter = null, delete = null; 23 | Component focus; 24 | public Component getFocus() { 25 | return focus; 26 | } 27 | public void setFocus(Component focus) { 28 | this.focus = focus; 29 | } 30 | public ThreadListPopupMenu(ThreadListExt thread){ 31 | this.thread=thread; 32 | this.add(copy = new JMenuItem("复制")); 33 | this.add(filter = new JMenuItem("过滤")); 34 | // this.add(delete = new JMenuItem("删除")); 35 | copy.addActionListener(new ActionListener() { 36 | 37 | @Override 38 | public void actionPerformed(ActionEvent e) { 39 | // TODO Auto-generated method stub 40 | String name=ThreadListPopupMenu.this.thread.getSelectedName(); 41 | Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); 42 | Transferable tText = new StringSelection(name); 43 | // System.out.println(name); 44 | clip.setContents(tText, null); 45 | } 46 | }); 47 | filter.addActionListener(new ActionListener() { 48 | 49 | @Override 50 | public void actionPerformed(ActionEvent e) { 51 | // TODO Auto-generated method stub 52 | String filterStr=JOptionPane.showInputDialog(ThreadListPopupMenu.this.thread,"输入过滤字符串:"); 53 | if(filterStr==null){ 54 | return; 55 | } 56 | ThreadListPopupMenu.this.thread.filterToThread(filterStr); 57 | } 58 | }); 59 | // delete.addActionListener(new ActionListener() { 60 | // 61 | // @Override 62 | // public void actionPerformed(ActionEvent e) { 63 | // // TODO Auto-generated method stub 64 | // String name=ThreadListPopupMenu.this.focus.getName(); 65 | // System.out.println(name); 66 | // ThreadListPopupMenu.this.thread.deleteSelectedName(name); 67 | // } 68 | // }); 69 | // this.setVisible(true); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/menu/TraceMenuBar.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.menu; 2 | 3 | import java.awt.event.ActionEvent; 4 | import java.awt.event.ActionListener; 5 | import java.io.File; 6 | 7 | import javax.swing.JFrame; 8 | import javax.swing.JMenu; 9 | import javax.swing.JMenuBar; 10 | import javax.swing.JMenuItem; 11 | import javax.swing.JOptionPane; 12 | 13 | import com.panda.trace.BytesHelper; 14 | import com.panda.trace.ThreadList; 15 | import com.panda.trace.Trace; 16 | import com.panda.trace.TraceThread; 17 | import com.panda.ui.TraceFrame; 18 | 19 | @SuppressWarnings("serial") 20 | public class TraceMenuBar extends JMenuBar{ 21 | JFrame frame; 22 | private JMenu menu1, menu2, menu3, menu4, menu5; 23 | private JMenuItem it1,it2; 24 | final String VERSION ="V 1.1"; 25 | final String HELP=" 使用方法:\r\n1.拖拽文件到界面,会自动解析trace文件;\r\n" 26 | + "2.双击某个线程名称,会以树形界面显示调用堆栈;\r\n" 27 | + "3.查找框支持对某些字符串查找;\r\n" 28 | + "4.右键点击线程列表支持过滤,复制;\r\n" 29 | + "5.右键点击mehtod,支持复制,显示时间,改名;"; 30 | public TraceMenuBar(JFrame frame){ 31 | super(); 32 | this.frame=frame; 33 | buildMenu(); 34 | } 35 | private boolean buildMenu(){ 36 | menu1 = new JMenu("文 件(F)"); 37 | menu1.setMnemonic('f'); //助记符 38 | it1=new JMenuItem("打开"); 39 | it2=new JMenuItem("新建窗口"); 40 | menu1.add(it1); 41 | menu1.add(it2); 42 | it1.addActionListener(new ActionListener() { 43 | 44 | @Override 45 | public void actionPerformed(ActionEvent e) { 46 | // TODO Auto-generated method stub 47 | File fl=((TraceFrame)frame).chooseFile(); 48 | if(fl==null){ 49 | return; 50 | } 51 | if(fl.getName().endsWith(".trace")){ 52 | try { 53 | if(((TraceFrame)frame).getTraceThreads()!=null){ 54 | ((TraceFrame)frame).getTraceThreads().reset(); 55 | } 56 | TraceThread.topMethod.getChild().clear(); 57 | // File fl=new File 58 | byte[] bytes=BytesHelper.toByteArray(fl.getPath()); 59 | Trace trace=new Trace(bytes); 60 | ((TraceFrame)frame).setTraceThreads(trace.getThreadList()); 61 | //threadList. 62 | ((TraceFrame)frame).updateUI(); 63 | System.out.println(TraceThread.topMethod.getChild().size()); 64 | 65 | } catch (Exception e1) { 66 | // TODO Auto-generated catch block 67 | e1.printStackTrace(); 68 | JOptionPane.showMessageDialog(null, "解析文件出错!", "提示", JOptionPane.OK_OPTION); 69 | } 70 | }else{ 71 | JOptionPane.showMessageDialog(null, "选中非trace文件!", "提示", JOptionPane.OK_OPTION); 72 | } 73 | } 74 | }); 75 | menu2 = new JMenu("编辑"); 76 | menu2.setMnemonic('E'); 77 | menu3 = new JMenu("格式"); 78 | menu4 = new JMenu("查看"); 79 | menu5 = new JMenu("帮助"); 80 | JMenuItem help=new JMenuItem("帮助文档"); 81 | JMenuItem version=new JMenuItem("版本"); 82 | menu5.add(help); 83 | menu5.add(version); 84 | help.addActionListener(new ActionListener() { 85 | 86 | @Override 87 | public void actionPerformed(ActionEvent e) { 88 | JOptionPane.showMessageDialog(frame, HELP); 89 | } 90 | }); 91 | version.addActionListener(new ActionListener() { 92 | 93 | @Override 94 | public void actionPerformed(ActionEvent e) { 95 | JOptionPane.showMessageDialog(frame, VERSION); 96 | } 97 | }); 98 | // jb2 = new JButton("打开"); 99 | this.add(menu1); 100 | this.add(menu2); 101 | this.add(menu3); 102 | this.add(menu4); 103 | this.add(menu5); 104 | return true; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/menu/TreePopupMenu.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.menu; 2 | 3 | import java.awt.Component; 4 | import java.awt.Toolkit; 5 | import java.awt.datatransfer.Clipboard; 6 | import java.awt.datatransfer.StringSelection; 7 | import java.awt.datatransfer.Transferable; 8 | import java.awt.event.ActionEvent; 9 | import java.awt.event.ActionListener; 10 | import java.awt.event.MouseAdapter; 11 | import java.awt.event.MouseEvent; 12 | import java.util.Enumeration; 13 | 14 | import javax.swing.JMenuItem; 15 | import javax.swing.JOptionPane; 16 | import javax.swing.JPopupMenu; 17 | import javax.swing.JTree; 18 | import javax.swing.tree.TreePath; 19 | 20 | import com.panda.ui.TraceFrame; 21 | import com.panda.ui.list.ThreadListExt; 22 | import com.panda.ui.tree.AbstractNode; 23 | import com.panda.ui.tree.CallStackTree; 24 | import com.panda.ui.tree.MethodNode; 25 | import com.panda.ui.tree.MethodsExtendTree; 26 | 27 | public class TreePopupMenu extends JPopupMenu{ 28 | JTree tree; 29 | private JMenuItem copy = null, hook = null, rename = null,fresh = null,showTime = null,hideTime=null; 30 | TreePath focus; 31 | public TreePath getFocus() { 32 | return focus; 33 | } 34 | public void setFocus(TreePath focus) { 35 | this.focus = focus; 36 | } 37 | public TreePopupMenu(JTree thread){ 38 | this.tree=thread; 39 | this.add(copy = new JMenuItem("复制")); 40 | hook = new JMenuItem("添加hook"); 41 | // this.add(hook = new JMenuItem("添加hook")); 42 | this.add(rename = new JMenuItem("编辑")); 43 | this.add(showTime = new JMenuItem("显示时间")); 44 | this.add(hideTime = new JMenuItem("隐藏时间")); 45 | // this.add(fresh = new JMenuItem("刷新")); 46 | copy.addActionListener(new ActionListener() { 47 | 48 | @Override 49 | public void actionPerformed(ActionEvent e) { 50 | // TODO Auto-generated method stub 51 | String name=""; 52 | if(focus.getPath().length>=1){ 53 | AbstractNode node=(AbstractNode)focus.getLastPathComponent(); 54 | if(node!=null){ 55 | name=node.getM().getFullName(); 56 | } 57 | } 58 | Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); 59 | Transferable tText = new StringSelection(name); 60 | // System.out.println(name); 61 | clip.setContents(tText, null); 62 | } 63 | }); 64 | hook.addActionListener(new ActionListener() { 65 | 66 | @Override 67 | public void actionPerformed(ActionEvent e) { 68 | // TODO Auto-generated method stub 69 | if(focus.getPath().length>=1){ 70 | AbstractNode node=(AbstractNode)focus.getLastPathComponent(); 71 | if(node!=null){ 72 | node.getM().getFullName(); 73 | } 74 | } 75 | 76 | } 77 | }); 78 | rename.addActionListener(new ActionListener() { 79 | 80 | @Override 81 | public void actionPerformed(ActionEvent e) { 82 | // TODO Auto-generated method stub 83 | if(focus.getPath().length>=1){ 84 | AbstractNode node=(AbstractNode)focus.getLastPathComponent(); 85 | if(node!=null){ 86 | String rename=JOptionPane.showInputDialog("输入新名称:"); 87 | if(rename==null){ 88 | return; 89 | } 90 | TraceFrame f; 91 | if(tree instanceof CallStackTree){ 92 | f=((CallStackTree)tree).getFrame(); 93 | }else{ 94 | f=((MethodsExtendTree)tree).getFrame(); 95 | } 96 | new Thread(new Change(f,node.getM().getFullName(),rename,node.getM().getOriginFullName())).start(); 97 | // node.getM().setFullName(rename); 98 | 99 | } 100 | } 101 | 102 | } 103 | }); 104 | showTime.addActionListener(new ActionListener() { 105 | 106 | @Override 107 | public void actionPerformed(ActionEvent e) { 108 | // TODO Auto-generated method stub 109 | if(focus.getPath().length>=1){ 110 | AbstractNode node=(AbstractNode)focus.getLastPathComponent(); 111 | if(node!=null){ 112 | node.setShowTime(true); 113 | Enumeration enums=node.preorderEnumeration(); 114 | while(enums.hasMoreElements()){ 115 | AbstractNode an=(AbstractNode) enums.nextElement(); 116 | if(an.getM().getFullName().startsWith("===")){ 117 | continue; 118 | } 119 | an.setShowTime(true); 120 | } 121 | } 122 | } 123 | 124 | } 125 | }); 126 | hideTime.addActionListener(new ActionListener() { 127 | 128 | @Override 129 | public void actionPerformed(ActionEvent e) { 130 | // TODO Auto-generated method stub 131 | if(focus.getPath().length>=1){ 132 | AbstractNode node=(AbstractNode)focus.getLastPathComponent(); 133 | if(node!=null){ 134 | node.setShowTime(false); 135 | Enumeration enums=node.preorderEnumeration(); 136 | while(enums.hasMoreElements()){ 137 | AbstractNode an=(AbstractNode) enums.nextElement(); 138 | if(an.getM().getFullName().startsWith("===")){ 139 | continue; 140 | } 141 | an.setShowTime(false); 142 | } 143 | } 144 | } 145 | 146 | } 147 | }); 148 | } 149 | class Change implements Runnable{ 150 | TraceFrame f; 151 | String rename; 152 | String name; 153 | String origin; 154 | public Change(TraceFrame f,String name,String rename,String origin){ 155 | this.f=f; 156 | this.rename=rename; 157 | this.name=name; 158 | this.origin=origin; 159 | } 160 | @Override 161 | public void run() { 162 | // TODO Auto-generated method stub 163 | f.rename(origin,name,rename); 164 | } 165 | 166 | } 167 | } 168 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/textfield/FilterTextField.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.textfield; 2 | 3 | import java.awt.event.KeyAdapter; 4 | import java.awt.event.KeyEvent; 5 | 6 | import javax.swing.JTextField; 7 | 8 | import com.panda.ui.TraceFrame; 9 | import com.panda.ui.tree.CallStackTree; 10 | import com.panda.ui.tree.MethodsExtendTree; 11 | 12 | public class FilterTextField extends JTextField{ 13 | TraceFrame jframe; 14 | String regString; 15 | public FilterTextField(TraceFrame jframe){ 16 | this.jframe=jframe; 17 | this.addKeyListener(new KeyAdapter() { 18 | @Override 19 | public void keyPressed(KeyEvent e) { 20 | if(e.getKeyCode()==KeyEvent.VK_ENTER){ 21 | //System.out.println(searchField.getText()); 22 | regString=FilterTextField.this.getText(); 23 | FilterTextField.this.jframe.evalSearch(regString); 24 | } 25 | } 26 | 27 | }); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/AbstractNode.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import javax.swing.Icon; 4 | import javax.swing.tree.DefaultMutableTreeNode; 5 | 6 | import com.panda.trace.MethodLog; 7 | 8 | public class AbstractNode extends DefaultMutableTreeNode{ 9 | protected MethodLog m; 10 | boolean showTime=false; 11 | public boolean isShowTime() { 12 | return showTime; 13 | } 14 | public void setShowTime(boolean showTime) { 15 | this.showTime = showTime; 16 | } 17 | public MethodLog getM() { 18 | return m; 19 | } 20 | public void setM(MethodLog m) { 21 | this.m = m; 22 | } 23 | public AbstractNode(MethodLog m) 24 | { 25 | super(); 26 | this.m=m; 27 | } 28 | public AbstractNode(Icon icon,MethodLog m) 29 | { 30 | super(); 31 | this.m=m; 32 | } 33 | public String getText() 34 | { 35 | return this.m.getFullName(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/CallStackModel.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.util.List; 4 | 5 | import javax.swing.tree.DefaultTreeModel; 6 | import javax.swing.tree.TreeNode; 7 | 8 | import com.panda.trace.MethodLog; 9 | import com.panda.util.MethodUtil; 10 | 11 | public class CallStackModel extends DefaultTreeModel{ 12 | public CallStackModel(TreeNode root) { 13 | super(root); 14 | // TODO Auto-generated constructor stub 15 | } 16 | public void addNode(CallStackNode node,MethodLog log){ 17 | int i=0; 18 | for(MethodLog m1:log.getChild()){ 19 | CallStackNode node1=new CallStackNode(m1,MethodUtil.getChildNum(m1)); 20 | this.insertNodeInto(node1, node, i++); 21 | if(m1.getChild().size()==0){ 22 | //System.out.println(m1.getFullName()+">>>>no child!"); 23 | continue; 24 | }else{ 25 | addNode(node1,m1); 26 | } 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/CallStackNode.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import javax.swing.Icon; 4 | import javax.swing.tree.DefaultMutableTreeNode; 5 | 6 | import com.panda.trace.MethodLog; 7 | 8 | public class CallStackNode extends AbstractNode{ 9 | private boolean needTab=false; 10 | int childNum; 11 | 12 | public int getChildNum() { 13 | return childNum; 14 | } 15 | 16 | public void setChildNum(int childNum) { 17 | this.childNum = childNum; 18 | } 19 | 20 | public boolean isNeedTab() { 21 | return needTab; 22 | } 23 | 24 | public void setNeedTab(boolean needTab) { 25 | this.needTab = needTab; 26 | } 27 | public CallStackNode(MethodLog m) 28 | { 29 | super(m); 30 | this.setAllowsChildren(true); 31 | } 32 | public CallStackNode(MethodLog m,int childNum) 33 | { 34 | super(m); 35 | this.childNum=childNum; 36 | this.setAllowsChildren(true); 37 | } 38 | 39 | //包含文本和图片的节点构造 40 | public CallStackNode(Icon icon,MethodLog m) 41 | { 42 | super(icon,m); 43 | this.setAllowsChildren(true); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/CallStackRender.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.awt.Color; 4 | import java.awt.Component; 5 | 6 | import javax.swing.Icon; 7 | import javax.swing.JLabel; 8 | import javax.swing.JPanel; 9 | import javax.swing.JTree; 10 | import javax.swing.tree.DefaultTreeCellRenderer; 11 | 12 | import com.panda.trace.MethodLog; 13 | 14 | public class CallStackRender extends DefaultTreeCellRenderer{ 15 | @Override 16 | public Component getTreeCellRendererComponent(JTree tree, Object value,boolean sel, boolean expanded, boolean leaf, int row,boolean hasFocus) 17 | { 18 | super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,row, hasFocus); //调用父类的该方法 19 | MethodLog m=((CallStackNode) value).getM(); 20 | // setOpaque(true); 21 | setForeground(Color.BLUE); 22 | setOpaque(false); 23 | setBackgroundSelectionColor(Color.LIGHT_GRAY); 24 | String text=m.getFullName(); 25 | text=text+"("+((CallStackNode) value).getChildNum()+")"; 26 | text=((CallStackNode) value).showTime?(text+" "): 27 | text; 28 | if(((CallStackNode) value).isNeedTab()){ 29 | setOpaque(true); 30 | setForeground(Color.RED); 31 | setBackground(Color.LIGHT_GRAY); 32 | return this; 33 | } 34 | setIcon(null);//设置图片 35 | setText(text);//设置文本 36 | // if(((CallStackNode) value).showTime){ 37 | // String time=(" "); 38 | // JLabel l=new JLabel(time); 39 | // l.setForeground(Color.BLACK); 40 | // } 41 | return this; 42 | } 43 | } -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/CallStackTree.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.awt.Component; 4 | import java.awt.event.MouseAdapter; 5 | import java.awt.event.MouseEvent; 6 | import java.awt.event.MouseListener; 7 | import java.util.Enumeration; 8 | import java.util.List; 9 | 10 | import javax.swing.JTree; 11 | import javax.swing.tree.TreePath; 12 | 13 | import com.panda.trace.MethodLog; 14 | import com.panda.trace.TraceThread; 15 | import com.panda.ui.TraceFrame; 16 | import com.panda.ui.menu.TreePopupMenu; 17 | import com.panda.util.MethodUtil; 18 | 19 | public class CallStackTree extends JTree{ 20 | TraceFrame frame; 21 | public TraceFrame getFrame() { 22 | return frame; 23 | } 24 | private CallStackModel treeModel; 25 | static final CallStackNode ROOT = new CallStackNode(new MethodLog("Method CallStack:")); 26 | static String mtReg=""; 27 | static int times; 28 | private String name; 29 | TreePopupMenu pop; 30 | public String getName() { 31 | return name; 32 | } 33 | public void setName(String name) { 34 | this.name = name; 35 | } 36 | public CallStackTree(TraceFrame frame){ 37 | this.frame=frame; 38 | treeModel=new CallStackModel(ROOT); 39 | this.setModel(treeModel); 40 | pop=new TreePopupMenu(this); 41 | this.addMouseListener(new MouseAdapter() { 42 | 43 | @Override 44 | public void mouseClicked(MouseEvent e) { 45 | // TODO Auto-generated method stub 46 | if(e.isMetaDown()){ 47 | pop.show(e.getComponent(), e.getX(), e.getY()); 48 | pop.setFocus(CallStackTree.this.getPathForLocation( e.getX(),e.getY())); 49 | } 50 | } 51 | }); 52 | } 53 | public void fillTree(String reg){ 54 | if(name==null||name==""){ 55 | return; 56 | } 57 | ROOT.removeAllChildren(); 58 | MethodLog top=TraceThread.topMethod; 59 | CallStackNode node=new CallStackNode(top); 60 | treeModel.insertNodeInto(node, ROOT, 0); 61 | int i=0; 62 | for(MethodLog m:top.getChild()){ 63 | if(m.getRecord().getThreadId()==Integer.parseInt(name)){ 64 | if(reg!=null&&!reg.equals("")){ 65 | m=MethodUtil.getRealMethod(m,reg); 66 | } 67 | if(m.getChild().size()==0){ 68 | continue; 69 | } 70 | CallStackNode md=new CallStackNode(m,MethodUtil.getChildNum(m)); 71 | 72 | //System.out.println(m.getFullName()+" "+top.getChild().size()+" "+i); 73 | treeModel.insertNodeInto(md, node, i++); 74 | treeModel.addNode(md,m); 75 | } 76 | } 77 | treeModel.reload(); 78 | } 79 | public void extendTreeMode(String reg){ 80 | if(mtReg.equals(reg)){ 81 | times++; 82 | }else{ 83 | mtReg=reg; 84 | times=1; 85 | } 86 | int n=times; 87 | Enumeration enums=ROOT.preorderEnumeration(); 88 | while(enums.hasMoreElements()&&n>0){ 89 | CallStackNode node=(CallStackNode) enums.nextElement(); 90 | if(node.getText().contains(reg)){ 91 | this.addSelectionPath(new TreePath(node.getPath())); 92 | n--; 93 | } 94 | } 95 | } 96 | public void extendMethod(String reg){ 97 | fillTree(reg); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/ExtendTreeKeyAdapter.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.awt.event.KeyAdapter; 4 | import java.awt.event.KeyEvent; 5 | 6 | import javax.swing.tree.TreePath; 7 | 8 | public class ExtendTreeKeyAdapter extends KeyAdapter{ 9 | MethodsExtendTree mTree; 10 | public ExtendTreeKeyAdapter(MethodsExtendTree mTree){ 11 | this.mTree=mTree; 12 | } 13 | @Override 14 | public void keyPressed(KeyEvent e) { 15 | // TODO Auto-generated method stub 16 | if(e.getKeyCode()==KeyEvent.VK_ENTER){ 17 | MethodNode note = (MethodNode) mTree.getLastSelectedPathComponent(); 18 | TreePath p=mTree.getSelectionPath(); 19 | // System.out.println(note.getChildCount()); 20 | if(note.getText().equals("===parent===")||note.getText().equals("===child===")){ 21 | return; 22 | } 23 | MethodsExtendModel model=(MethodsExtendModel)mTree.getModel(); 24 | mTree.selectMMode(model.getMethods(),note.getText()); 25 | model.reload(); 26 | mTree.addSelectionPath(p);; 27 | } 28 | } 29 | 30 | } 31 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/ExtendTreeMouseAdapter.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.awt.event.KeyEvent; 4 | import java.awt.event.MouseAdapter; 5 | import java.awt.event.MouseEvent; 6 | 7 | import javax.swing.tree.DefaultTreeModel; 8 | import javax.swing.tree.TreePath; 9 | 10 | import com.panda.ui.menu.ThreadListPopupMenu; 11 | import com.panda.ui.menu.TreePopupMenu; 12 | 13 | public class ExtendTreeMouseAdapter extends MouseAdapter{ 14 | MethodsExtendTree mTree; 15 | TreePopupMenu pop; 16 | public ExtendTreeMouseAdapter(MethodsExtendTree mTree){ 17 | this.mTree=mTree; 18 | pop=new TreePopupMenu(mTree); 19 | } 20 | @Override 21 | public void mouseClicked(MouseEvent e) { 22 | // TODO Auto-generated method stub 23 | if(e.getClickCount()==2){ 24 | MethodNode note = (MethodNode) mTree.getLastSelectedPathComponent(); 25 | TreePath p=mTree.getSelectionPath(); 26 | if(note.isRootNode()&¬e.isNeedExpend()){ 27 | note.setNeedExpend(false); 28 | MethodNode n0=(MethodNode)note.getChildAt(0); 29 | MethodNode n1=(MethodNode)note.getChildAt(1); 30 | if(n0.getText().equals("===parent===")){ 31 | MethodNode mp=new MethodNode(note.m.getParent()); 32 | ((DefaultTreeModel) mTree.getModel()).insertNodeInto(mp, n0, 0); 33 | } 34 | if(n1.getText().equals("===parent===")){ 35 | MethodNode mp=new MethodNode(note.m.getParent()); 36 | ((DefaultTreeModel) mTree.getModel()).insertNodeInto(mp, n1, 0); 37 | } 38 | if(n0.getText().equals("===child===")){ 39 | for(int j=0;j"): 25 | text; 26 | 27 | if(((MethodNode) value).isNeedTab()){ 28 | setOpaque(true); 29 | setForeground(Color.RED); 30 | setBackground(Color.LIGHT_GRAY); 31 | } 32 | setIcon(null); 33 | setText(text);//设置文本 34 | return this; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/MethodsExtendModel.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.util.List; 4 | 5 | import javax.swing.tree.DefaultTreeModel; 6 | import javax.swing.tree.TreeNode; 7 | 8 | import com.panda.trace.MethodLog; 9 | import com.panda.util.MethodUtil; 10 | 11 | public class MethodsExtendModel extends DefaultTreeModel{ 12 | private int where=-1; 13 | public int getWhere() { 14 | return where; 15 | } 16 | public void setWhere(int where) { 17 | this.where = where; 18 | } 19 | private String name; 20 | public String getName() { 21 | return name; 22 | } 23 | public void setName(String name) { 24 | this.name = name; 25 | } 26 | private List methods; 27 | public List getMethods() { 28 | return methods; 29 | } 30 | public void setMethods(List methods) { 31 | this.methods = methods; 32 | } 33 | public MethodsExtendModel(TreeNode root) { 34 | super(root); 35 | // TODO Auto-generated constructor stub 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/ui/tree/MethodsExtendTree.java: -------------------------------------------------------------------------------- 1 | package com.panda.ui.tree; 2 | 3 | import java.util.ArrayList; 4 | import java.util.Enumeration; 5 | import java.util.List; 6 | 7 | import javax.swing.JTree; 8 | 9 | import com.panda.trace.MethodLog; 10 | import com.panda.trace.TraceThread; 11 | import com.panda.ui.TraceFrame; 12 | 13 | public class MethodsExtendTree extends JTree{ 14 | TraceFrame frame; 15 | public TraceFrame getFrame() { 16 | return frame; 17 | } 18 | private MethodsExtendModel mModel; 19 | static final MethodNode ROOT = new MethodNode(new MethodLog("Methods List:")); 20 | public final static int MAX=2000; 21 | public MethodsExtendTree(TraceFrame frame){ 22 | super(); 23 | this.frame=frame; 24 | mModel=new MethodsExtendModel(ROOT); 25 | this.setModel(mModel); 26 | this.addKeyListener(new ExtendTreeKeyAdapter(this)); 27 | this.addMouseListener(new ExtendTreeMouseAdapter(this)); 28 | } 29 | protected void selectMMode(List methods,String reg){ 30 | Enumeration enums=ROOT.children(); 31 | while(enums.hasMoreElements()){ 32 | MethodNode node=(MethodNode) enums.nextElement(); 33 | if(node.getText().contains(reg)){ 34 | node.setNeedTab(true); 35 | //System.out.println(node.getText()); 36 | }else{ 37 | node.setNeedTab(false); 38 | } 39 | } 40 | } 41 | //一次最多加载2000节点 42 | public void reloadMMode(List methods,int fromWhen,String reg){ 43 | int i=0; 44 | if(methods==null){ 45 | return; 46 | } 47 | if(fromWhen==-1){ 48 | return; 49 | } 50 | if(reg!=null®!=""){ 51 | List methods_=new ArrayList(); 52 | for(i=0;i=methods.size()){ 68 | min=0; 69 | max=methods.size(); 70 | mModel.setWhere(-1); 71 | // System.out.println(methods.size()+" "+mModel.getWhere()); 72 | }else{ 73 | min=fromWhen*MAX; 74 | max=(fromWhen+1)*MAX; 75 | if(max>=methods.size()){ 76 | max=methods.size(); 77 | mModel.setWhere(-1); 78 | }else{ 79 | mModel.setWhere(fromWhen+1); 80 | } 81 | } 82 | int n=min; 83 | for(i=min;i< max;++i){ 84 | MethodLog m=methods.get(i); 85 | if(m.getFullName().equals(TraceThread.noPart.getFullName())){ 86 | m=m.getPartner(); 87 | } 88 | if(!m.getFullName().contains(reg)){ 89 | continue; 90 | } 91 | MethodNode mm=new MethodNode(m,n); 92 | mModel.insertNodeInto(mm,ROOT,n++); 93 | MethodNode parent=new MethodNode(new MethodLog("===parent===")); 94 | MethodNode child=new MethodNode(new MethodLog("===child===")); 95 | mModel.insertNodeInto(parent, mm, 0); 96 | mModel.insertNodeInto(child, mm, 1); 97 | } 98 | mModel.reload(); 99 | } 100 | public void reloadMMode(int where,String reg){ 101 | ROOT.removeAllChildren(); 102 | reloadMMode(mModel.getMethods(),where,reg); 103 | mModel.reload(); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /TraceReader/src/com/panda/util/MethodUtil.java: -------------------------------------------------------------------------------- 1 | package com.panda.util; 2 | 3 | import java.util.List; 4 | 5 | import com.panda.trace.MethodLog; 6 | import com.panda.trace.TraceRecord; 7 | 8 | public class MethodUtil { 9 | public static MethodLog getRealMethod(MethodLog m,String reg){ 10 | MethodLog topMethod=new MethodLog(m.getFullName()); 11 | if(m.getFullName().contains(reg)){ 12 | topMethod.getChild().add(m); 13 | return topMethod; 14 | } 15 | List list=m.getChild(); 16 | for(MethodLog m1:list){ 17 | getMethod(m1,topMethod,reg); 18 | } 19 | return topMethod; 20 | } 21 | public static void getMethod(MethodLog m,MethodLog topMethod,String reg){ 22 | if(m.getFullName().contains(reg)){ 23 | topMethod.getChild().add(m); 24 | return; 25 | }else{ 26 | for(MethodLog m1:m.getChild()){ 27 | getMethod(m1,topMethod,reg); 28 | } 29 | } 30 | } 31 | public static int getChildNum(MethodLog log){ 32 | int sum=log.getChild().size(); 33 | if(sum==0){ 34 | return sum; 35 | } 36 | for(MethodLog m1:log.getChild()){ 37 | sum=sum+getChildNum(m1); 38 | } 39 | return sum; 40 | } 41 | // public static String getJavaSig(TraceRecord r){ 42 | // if(r.getM()==null){ 43 | // return null; 44 | // } 45 | // String sig=r.getM().getMethodSig(); 46 | // return anlysisSig(sig); 47 | // } 48 | public static String anlysisSig(String sig){ 49 | if(!sig.startsWith("(")){ 50 | return null; 51 | } 52 | char[] sigChars=sig.toCharArray(); 53 | int i=0; 54 | String javaSig=""; 55 | i++; 56 | while(sigChars[i]!=')'){ 57 | char c=sigChars[i++]; 58 | String prim=getPrimitiveString(c); 59 | if(prim.equals("")){ 60 | if(c=='L'){ 61 | while(sigChars[i]!=';'){ 62 | javaSig=javaSig+sigChars[i]; 63 | i++; 64 | } 65 | javaSig=javaSig+";"; 66 | i++; 67 | continue; 68 | }else{ 69 | javaSig=javaSig+c; 70 | while(sigChars[i]=='['){ 71 | javaSig=javaSig+sigChars[i]; 72 | i++; 73 | } 74 | if(sigChars[i]=='L'){ 75 | i++; 76 | javaSig=javaSig+"L"; 77 | while(sigChars[i]!=';'){ 78 | javaSig=javaSig+sigChars[i]; 79 | i++; 80 | } 81 | javaSig=javaSig+";"; 82 | i++; 83 | continue; 84 | }else{ 85 | javaSig=javaSig+sigChars[i++]+";"; 86 | continue; 87 | } 88 | } 89 | }else{ 90 | javaSig=javaSig+prim+";"; 91 | } 92 | } 93 | return javaSig; 94 | } 95 | public static String getPrimitiveString(char c){ 96 | switch(c){ 97 | case 'I':{ 98 | return "int"; 99 | } 100 | case 'B':{ 101 | return "byte"; 102 | } 103 | case 'S':{ 104 | return "short"; 105 | } 106 | case 'J':{ 107 | return "long"; 108 | } 109 | case 'D':{ 110 | return "double"; 111 | } 112 | case 'C':{ 113 | return "char"; 114 | } 115 | case 'F':{ 116 | return "float"; 117 | } 118 | case 'Z':{ 119 | return "boolean"; 120 | } 121 | default:{ 122 | return ""; 123 | } 124 | } 125 | } 126 | public static boolean isPrimitiveString(String s){ 127 | if(s.equals("int")||s.equals("byte")||s.equals("short")||s.equals("long")||s.equals("double")||s.equals("char") 128 | ||s.equals("float")||s.equals("boolean")){ 129 | return true; 130 | }else{ 131 | return false; 132 | } 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /TraceReader/test.trace: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/panhongwei/TraceReader/614b6c706c76fb355d0f8076fff72bdee40a2f1c/TraceReader/test.trace --------------------------------------------------------------------------------