├── 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 | 
8 | 2)支持显示线程。
9 | 
10 | 3)支持树形显示方法调用
11 | 
12 | 4)支持按列显示运行方法
13 | 
14 | 5)支持搜索
15 | 
16 | 6)支持复制、重命名
17 | 
18 | 
19 | 7)支持显示调用时间
20 | 
21 | 
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
--------------------------------------------------------------------------------