update doc

pull/483/head
hengyunabc 6 years ago
parent 3f44c442ae
commit 6708b26f28

@ -3,8 +3,6 @@ Arthas 用户文档
**[English Docs](https://alibaba.github.io/arthas/en/)**
**Arthas正在参加“2018年度最受欢迎中国开源软件评选” 请支持Arthas[投票地址](https://www.oschina.net/project/top_cn_2018)**
## Arthas阿尔萨斯 能为你做什么?
![arthas](arthas.png)

@ -4,8 +4,8 @@
## 1. 启动Demo
```bash
wget https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar
$ wget https://alibaba.github.io/arthas/arthas-demo.jar
$ java -jar arthas-demo.jar
```
`arthas-demo`是一个简单的程序,每隔一秒生成一个随机数,再执行质因式分解,并打印出分解结果。
@ -95,9 +95,9 @@ java.home /Library/Java/JavaVir
e/jre
```
## 4. 通过thread命令来获取到进程的Main Class
## 4. 通过thread命令来获取到`arthas-demo`进程的Main Class
```
```bash
$ thread -n -1 | grep 'main('
at demo.MathGame.main(MathGame.java:17)
```

@ -27,84 +27,47 @@ stack
### 使用例子
> 注意:如果表达式里面包含了引号,那么需要把整个表达式用引号括起来,如果表达式中没有包含引号,那么可以不用引号。当然,一个好的习惯是,不管表达式中有没有引号,都使用引号括起来。
#### 启动 Demo
```
$ stack com.alibaba.sample.petstore.dal.dao.ProductDao getProductById 'params[0]=="K9-BD-01"'
启动[快速入门](quick-start.md)里的`arthas-demo`。
#### stack
```bash
$ stack demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 51 ms.
thread_name="http-bio-8080-exec-4" thread_id=0x4a;is_daemon=true;priority=5;
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50)
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(<generated>:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
......
thread_name="http-bio-8080-exec-2" thread_id=0x48;is_daemon=true;priority=5;
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50)
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(<generated>:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
......
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms.
ts=2018-12-04 01:32:19;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
```
按照耗时查询:
#### 据条件表达式来过滤
```bash
$ stack demo.MathGame primeFactors 'params[0]<0' -n 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 30 ms.
ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
Command execution times exceed limit: 2, so command will exit. You can set it with -n option.
```
$ stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30
#### 据执行时间来过滤
```bash
$ stack demo.MathGame primeFactors '#cost>5'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 123 ms.
stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30
thread_name=http-nio-8080-exec-10;id=31;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
@com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(<generated>:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invokeBody(LoopValve.java:105)
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invoke(LoopValve.java:83)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.invoke(PageAuthorizationValve.java:105)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.CheckCsrfTokenValve.invoke(CheckCsrfTokenValve.java:123)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.AnalyzeURLValve.invoke(AnalyzeURLValve.java:126)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.SetLoggingContextValve.invoke(SetLoggingContextValve.java:66)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PrepareForTurbineValve.invoke(PrepareForTurbineValve.java:52)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.webx.impl.WebxControllerImpl.service(WebxControllerImpl.java:43)
at com.alibaba.citrus.webx.impl.WebxRootControllerImpl.handleRequest(WebxRootControllerImpl.java:53)
at com.alibaba.citrus.webx.support.AbstractWebxRootController.service(AbstractWebxRootController.java:165)
.........
Affect(class-cnt:1 , method-cnt:1) cost in 35 ms.
ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
```
>只会打印出耗时超过30ms的堆栈情况

@ -26,11 +26,9 @@ trace
* 特殊用法请参考:[https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71)
* OGNL表达式官网[https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果现在Arthas可以按照方法执行的耗时来进行过滤了例如`trace *StringUtils isBlank '$cost>100'`表示当执行时间超过100ms的时候才会输出trace的结果。
很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果现在Arthas可以按照方法执行的耗时来进行过滤了例如`trace *StringUtils isBlank '#cost>100'`表示当执行时间超过100ms的时候才会输出trace的结果。
> 注意:
> 1. watch/stack/trace这个三个命令都支持$cost
> 2. 如果是Arthas 3.0,请把`$cost`改为`#cost`
> watch/stack/trace这个三个命令都支持`#cost`
### 注意事项
@ -38,75 +36,54 @@ trace
### 使用参考
代码示例:
```java
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
List<String> list2 = new ArrayList<String>();
list2.add("c");
list2.add("d");
int len = add(list, list2);
}
private static int add(List<String> list, List<String> list2) {
int i = 10;
while (i >= 0) {
try {
hehe(i);
} catch (Throwable t) {
t.printStackTrace();
}
i--;
}
list.addAll(list2);
return list.size();
}
private static void hehe(int i) {
if (i == 0) {
throw new RuntimeException("ZERO");
}
}
#### 启动 Demo
启动[快速入门](quick-start.md)里的`arthas-demo`。
#### trace函数
```bash
$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 42 ms.
`---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[10.611029ms] demo.MathGame:run()
+---[0.05638ms] java.util.Random:nextInt()
+---[10.036885ms] demo.MathGame:primeFactors()
`---[0.170316ms] demo.MathGame:print()
```
监测 `add` 方法:
#### 过滤掉jdk的函数
```shell
$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList add params.length==2
```bash
$ trace -j demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 144 ms.
`---Tracing...
`---[2ms]com.alibaba.sample.petstore.web.store.module.screen.ItemList:add()
+---[0,0,0ms,11]com.alibaba.sample.petstore.web.store.module.screen.ItemList:hehe() [throws Exception]
+---[1ms]java.lang.Throwable:printStackTrace()
+---[0ms]java.util.List:addAll()
`---[0ms]java.util.List:size()
Affect(class-cnt:1 , method-cnt:1) cost in 31 ms.
`---ts=2018-12-04 01:09:14;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[5.190646ms] demo.MathGame:run()
+---[4.465779ms] demo.MathGame:primeFactors()
`---[0.375324ms] demo.MathGame:print()
```
按照耗时过滤:
* `-j`: jdkMethodSkip, skip jdk method trace
#### 据调用耗时过滤
```shell
$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>4
```bash
$ trace demo.MathGame run '#cost > 10'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 159 ms.
trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>4
`---thread_name=http-nio-8080-exec-5;id=2c;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
`---[8.866586ms] com.alibaba.sample.petstore.web.store.module.screen.ItemList:execute()
+---[2.847106ms] com.alibaba.sample.petstore.biz.StoreManager:getAllProductItems()
+---[0.765544ms] com.alibaba.sample.petstore.dal.dao.ProductDao:getProductById()
+---[0.021204ms] com.alibaba.sample.petstore.dal.dataobject.Product:getCategoryId()
+---[1.341532ms] com.alibaba.sample.petstore.dal.dao.CategoryDao:getCategoryById()
`---[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] com.alibaba.citrus.turbine.Context:put()
Affect(class-cnt:1 , method-cnt:1) cost in 41 ms.
`---ts=2018-12-04 01:12:02;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[12.033735ms] demo.MathGame:run()
+---[0.006783ms] java.util.Random:nextInt()
+---[11.852594ms] demo.MathGame:primeFactors()
`---[0.05447ms] demo.MathGame:print()
```
> 只会展示耗时大于4ms的调用路径有助于在排查问题的时候只关注异常情况
- 是不是很眼熟,没错,在 JProfiler 等收费软件中你曾经见识类似的功能,这里你将可以通过命令就能打印出指定调用路径。 友情提醒下,`trace` 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销。所以这统计出来有些许的不准,渲染路径上调用的类、方法越多,性能偏差越大。但还是能让你看清一些事情的。
- [2ms] 的含义,`2` 的含义是:当前节点在当前步骤的耗时,单位为毫秒
- [12.033735ms] 的含义,`12.033735` 的含义是:当前节点在当前步骤的耗时,单位为毫秒
- [0,0,0ms,11]xxx:yyy() [throws Exception],对该方法中相同的方法调用进行了合并,`0,0,0ms,11` 表示方法调用耗时,`min,max,total,count``throws Exception` 表明该方法调用中存在异常返回
- 这里存在一个统计不准确的问题,就是所有方法耗时加起来可能会小于该监测方法的总耗时,这个是由于 Arthas 本身的逻辑会有一定的耗时

@ -9,27 +9,29 @@ tt
于是乎TimeTunnel 命令就诞生了。
### 记录方法的调用
### 使用参考
- 基本用法
对于一个最基本的使用来说,就是记录下当前方法的每次调用环境现场。
```java
$ tt -t -n 3 *Test print
Press Ctrl+D or Ctrl+X to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 115 ms.
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1007 | 2015-07-26 12:23:21 | 138 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1008 | 2015-07-26 12:23:22 | 143 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1009 | 2015-07-26 12:23:23 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
$
```
#### 启动 Demo
启动[快速入门](quick-start.md)里的`arthas-demo`。
#### 记录调用
对于一个最基本的使用来说,就是记录下当前方法的每次调用环境现场。
```bash
$ tt -t demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
```
- 命令参数解析
@ -59,8 +61,8 @@ tt
- 条件表达式
不知道大家是否有在使用过程中遇到以下困惑
* Arthas 似乎很难区分出重载的方法
* 我只需要观察特定参数,但是 tt 却全部都给我记录了下来
* Arthas 似乎很难区分出重载的方法
* 我只需要观察特定参数,但是 tt 却全部都给我记录了下来
条件表达式也是用 `OGNL` 来编写,核心的判断对象依然是 `Advice` 对象。除了 `tt` 命令之外,`watch`、`trace`、`stack` 命令也都支持条件表达式。
@ -80,130 +82,91 @@ tt
前边看到了很多条件表达式中,都适用了 `params[0]`,有关这个变量的介绍,请参考[表达式核心变量](advice-class.md)
### 检索调用记录
#### 检索调用记录
当你用 `tt` 记录了一大片的时间片段之后,你希望能从中筛选出自己需要的时间片段,这个时候你就需要对现有记录进行检索。
假设我们有这些记录
```
```bash
$ tt -l
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1000 | 2015-07-26 01:16:27 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1002 | 2015-07-26 01:16:28 | 119 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1004 | 2015-07-26 12:21:56 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1005 | 2015-07-26 12:21:57 | 138 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1006 | 2015-07-26 12:21:58 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:7) cost in 2 ms.
$
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
9
1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors
Affect(row-cnt:6) cost in 4 ms.
```
我需要筛选出 `printAddress` 方法的调用信息
```
$ tt -s method.name=="printAddress"
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:2) cost in 55 ms.
$
我需要筛选出 `primeFactors` 方法的调用信息
```bash
$ tt -s 'method.name=="primeFactors"'
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
9
1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors
Affect(row-cnt:6) cost in 607 ms.
```
你需要一个 `-s` 参数。<span style="color:red;">同样的,搜索表达式的核心对象依旧是 `Advice` 对象。</span>
### 查看调用信息
#### 查看调用信息
对于具体一个时间片的信息而言,你可以通过 `-i` 参数后边跟着对应的 `INDEX` 编号查看到他的详细信息。
```
$
```bash
$ tt -i 1003
+-----------------+------------------------------------------------------------------------------------------------------+
| INDEX | 1003 |
+-----------------+------------------------------------------------------------------------------------------------------+
| GMT-CREATE | 2015-07-26 01:16:28 |
+-----------------+------------------------------------------------------------------------------------------------------+
| COST(ms) | 0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(Unknown Source) |
| | at GaOgnlUtilsTest.<init>(Unknown Source) |
| | at GaOgnlUtilsTest.main(Unknown Source) |
+-----------------+------------------------------------------------------------------------------------------------------+
Affect(row-cnt:1) cost in 1 ms.
$
INDEX 1003
GMT-CREATE 2018-12-04 11:15:41
COST(ms) 0.186073
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
IS-RETURN false
IS-EXCEPTION true
PARAMETERS[0] @Integer[-564322413]
THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need >= 2
at demo.MathGame.primeFactors(MathGame.java:46)
at demo.MathGame.run(MathGame.java:24)
at demo.MathGame.main(MathGame.java:16)
Affect(row-cnt:1) cost in 11 ms.
```
### 重做一次调用
#### 重做一次调用
当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。
`tt` 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 `INDEX` 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 `-p` 参数。
```
$ tt -i 1003 -p
+-----------------+---------------------------------------------------------------------------------------------------------+
| RE-INDEX | 1003 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| GMT-REPLAY | 2015-07-26 17:29:51 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+---------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+---------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+---------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(GaOgnlUtilsTest.java:78) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |
| | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |
| | at java.lang.reflect.Method.invoke(Method.java:483) |
| | at com.github.ompc.Arthas.util.GaMethod.invoke(GaMethod.java:81) |
| | at com.github.ompc.Arthas.command.TimeTunnelCommand$6.action(TimeTunnelCommand.java:592) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.execute(DefaultCommandHandler.java:175) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.executeCommand(DefaultCommandHandler.java:83) |
| | at com.github.ompc.Arthas.server.GaServer$4.run(GaServer.java:329) |
| | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) |
| | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) |
| | at java.lang.Thread.run(Thread.java:745) |
+-----------------+---------------------------------------------------------------------------------------------------------+
replay time fragment[1003] success.
Affect(row-cnt:1) cost in 3 ms.
$
```bash
$ tt -i 1004 -p
RE-INDEX 1004
GMT-REPLAY 2018-12-04 11:26:00
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
PARAMETERS[0] @Integer[946738738]
IS-RETURN true
IS-EXCEPTION false
RETURN-OBJ @ArrayList[
@Integer[2],
@Integer[11],
@Integer[17],
@Integer[2531387],
]
Time fragment[1004] successfully replayed.
Affect(row-cnt:1) cost in 14 ms.
```
你会发现结果虽然一样,但调用的路径发生了变化,有原来的程序发起变成了 Arthas 自己的内部线程发起的调用了。

@ -38,6 +38,8 @@ watch 的参数比较多,主要是因为它能在 4 个不同的场景观察
### 使用参考
#### 启动 Demo
启动[快速入门](quick-start.md)里的`arthas-demo`。
#### 观察方法出参和返回值
@ -223,7 +225,7 @@ ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
然后使用`target.field_name`访问当前对象的某个属性
```
```bash
$ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.

@ -94,9 +94,9 @@ java.home /Library/Java/JavaVir
e/jre
```
## 4. Get the Main Class of the process with the thread command
## 4. Get the Main Class of the `arthas-demo` process with the thread command
```
```bash
$ thread -n -1 | grep 'main('
at demo.MathGame.main(MathGame.java:17)
```

@ -25,85 +25,49 @@ Pls. refer to [core parameters in expression](advice-class.md) for more details.
### Usage
> Notes: if there's quotes character (say, `'`) in the expression, then the whole expression must be wrapped by quotes but with the other type (in this case, `"`) too. On contrary, it's no need to quote the expression itself if there's no quotes character found in it, but it is strongly recommended.
#### Start Demo
Print out calling stack when the first method parameter is "K9-BD-01" for 'getProductById()' method:
Start `arthas-demo` in [Quick Start](quick-start.md).
#### stack
```bash
$ stack demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms.
ts=2018-12-04 01:32:19;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
```
#### Filtering by condition expression
```bash
$ stack com.alibaba.sample.petstore.dal.dao.ProductDao getProductById 'params[0]=="K9-BD-01"'
$ stack demo.MathGame primeFactors 'params[0]<0' -n 2
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 51 ms.
thread_name="http-bio-8080-exec-4" thread_id=0x4a;is_daemon=true;priority=5;
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50)
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(<generated>:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
......
thread_name="http-bio-8080-exec-2" thread_id=0x48;is_daemon=true;priority=5;
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50)
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(<generated>:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
...
Affect(class-cnt:1 , method-cnt:1) cost in 30 ms.
ts=2018-12-04 01:34:27;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
ts=2018-12-04 01:34:30;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
Command execution times exceed limit: 2, so command will exit. You can set it with -n option.
```
Print out the calling stack when method 'execute()' takes more than 30ms to finish:
#### Filtering by cost
```bash
$ stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30
$ stack demo.MathGame primeFactors '#cost>5'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 123 ms.
stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>30
thread_name=http-nio-8080-exec-10;id=31;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
@com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(<generated>:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invokeBody(LoopValve.java:105)
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invoke(LoopValve.java:83)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.invoke(PageAuthorizationValve.java:105)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.CheckCsrfTokenValve.invoke(CheckCsrfTokenValve.java:123)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.AnalyzeURLValve.invoke(AnalyzeURLValve.java:126)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.SetLoggingContextValve.invoke(SetLoggingContextValve.java:66)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PrepareForTurbineValve.invoke(PrepareForTurbineValve.java:52)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.webx.impl.WebxControllerImpl.service(WebxControllerImpl.java:43)
at com.alibaba.citrus.webx.impl.WebxRootControllerImpl.handleRequest(WebxRootControllerImpl.java:53)
at com.alibaba.citrus.webx.support.AbstractWebxRootController.service(AbstractWebxRootController.java:165)
...
Affect(class-cnt:1 , method-cnt:1) cost in 35 ms.
ts=2018-12-04 01:35:58;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
@demo.MathGame.run()
at demo.MathGame.main(MathGame.java:16)
```

@ -24,11 +24,10 @@ Pls. refer to [core parameters in expression](advice-class.md) for more details.
* Pls. also refer to [https://github.com/alibaba/arthas/issues/71](https://github.com/alibaba/arthas/issues/71) for more advanced usage
* OGNL official site: [https://commons.apache.org/proper/commons-ognl/language-guide.html](https://commons.apache.org/proper/commons-ognl/language-guide.html)
Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: `trace *StringUtils isBlank '$cost>100'` means trace result will only be output when the executing time exceeds 100ms.
Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: `trace *StringUtils isBlank '#cost>100'` means trace result will only be output when the executing time exceeds 100ms.
> Notes:
> 1. `watch`/`stack`/`trace`, these three commands all support `$cost`.
> 2. On version `3.0`, pls. use `#cost` instead of `$cost`.
> `watch`/`stack`/`trace`, these three commands all support `#cost`.
### Notice
@ -36,77 +35,54 @@ Many times what we are interested is the exact trace result when the method call
### Usage
Sample code:
```java
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
List<String> list2 = new ArrayList<String>();
list2.add("c");
list2.add("d");
int len = add(list, list2);
}
private static int add(List<String> list, List<String> list2) {
int i = 10;
while (i >= 0) {
try {
hehe(i);
} catch (Throwable t) {
t.printStackTrace();
}
i--;
}
list.addAll(list2);
return list.size();
}
private static void hehe(int i) {
if (i == 0) {
throw new RuntimeException("ZERO");
}
}
#### Start Demo
Start `arthas-demo` in [Quick Start](quick-start.md).
#### trace method
```bash
$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 42 ms.
`---ts=2018-12-04 00:44:17;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[10.611029ms] demo.MathGame:run()
+---[0.05638ms] java.util.Random:nextInt()
+---[10.036885ms] demo.MathGame:primeFactors()
`---[0.170316ms] demo.MathGame:print()
```
Trace down method `add`:
#### Ignore jdk method
```shell
$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList add params.length==2
```bash
$ trace -j demo.MathGame run
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 144 ms.
`---Tracing...
`---[2ms]com.alibaba.sample.petstore.web.store.module.screen.ItemList:add()
+---[0,0,0ms,11]com.alibaba.sample.petstore.web.store.module.screen.ItemList:hehe() [throws Exception]
+---[1ms]java.lang.Throwable:printStackTrace()
+---[0ms]java.util.List:addAll()
`---[0ms]java.util.List:size()
Affect(class-cnt:1 , method-cnt:1) cost in 31 ms.
`---ts=2018-12-04 01:09:14;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[5.190646ms] demo.MathGame:run()
+---[4.465779ms] demo.MathGame:primeFactors()
`---[0.375324ms] demo.MathGame:print()
```
Filter by time cost:
* `-j`: jdkMethodSkip, skip jdk method trace
#### Filtering by cost
```shell
$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>4
```bash
$ trace demo.MathGame run '#cost > 10'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 159 ms.
trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost>4
`---thread_name=http-nio-8080-exec-5;id=2c;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
`---[8.866586ms] com.alibaba.sample.petstore.web.store.module.screen.ItemList:execute()
+---[2.847106ms] com.alibaba.sample.petstore.biz.StoreManager:getAllProductItems()
+---[0.765544ms] com.alibaba.sample.petstore.dal.dao.ProductDao:getProductById()
+---[0.021204ms] com.alibaba.sample.petstore.dal.dataobject.Product:getCategoryId()
+---[1.341532ms] com.alibaba.sample.petstore.dal.dao.CategoryDao:getCategoryById()
`---[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] com.alibaba.citrus.turbine.Context:put()
Affect(class-cnt:1 , method-cnt:1) cost in 41 ms.
`---ts=2018-12-04 01:12:02;thread_name=main;id=1;is_daemon=false;priority=5;TCCL=sun.misc.Launcher$AppClassLoader@3d4eac69
`---[12.033735ms] demo.MathGame:run()
+---[0.006783ms] java.util.Random:nextInt()
+---[11.852594ms] demo.MathGame:primeFactors()
`---[0.05447ms] demo.MathGame:print()
```
> Only the call path which's time cost is higher than `4ms` will be shown. This feature is handy to focus on what's needed to focus when troubleshoot.
> Only the call path which's time cost is higher than `10ms` will be shown. This feature is handy to focus on what's needed to focus when troubleshoot.
* Here Arthas provides the similar functionality JProfile and other commercial software provide. Compared to these professional softwares, Arthas doesn't deduce the time cost `trace` itself takes, therefore it is not as accurate as these softwares offer. More classes and methods on the calling path, more inaccurate `trace` output is, but it is still helpful for diagnostics where the bottleneck is.
* "[2.847106ms] com.alibaba.sample.petstore.biz.StoreManager:getAllProductItems()" means "getAllProductItem()" method from "com.alibaba.sample.petstore.biz.StoreManager" takes `2.847106` ms.
* "[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] com.alibaba.citrus.turbine.Context:put()" means aggregating all same method calls into one single line. The minimum time cost is `0.005428` ms, the maximum time cost is `0.094064` ms, and the total time cost for all method calls (`3` times in total) to "com.alibaba.citrus.turbine.Context:put()" is `0.105228ms`. If "throws Exception" appears in this line, it means some exceptions have been thrown from this method calls.
* "[12.033735ms]" means the method on the node takes `12.033735` ms.
* "[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] demo:call()" means aggregating all same method calls into one single line. The minimum time cost is `0.005428` ms, the maximum time cost is `0.094064` ms, and the total time cost for all method calls (`3` times in total) to "demo:call()" is `0.105228ms`. If "throws Exception" appears in this line, it means some exceptions have been thrown from this method calls.
* The total time cost may not equal to the sum of the time costs each sub method call takes, this is because Arthas instrumented code takes time too.

@ -11,35 +11,37 @@ With the help of `tt` (*TimeTunnel*), you can check the contexts of the methods
### Usage
Let's record the whole calling contexts:
```java
$ tt -t -n 3 *Test print
Press Ctrl+D or Ctrl+X to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 115 ms.
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1007 | 2015-07-26 12:23:21 | 138 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1008 | 2015-07-26 12:23:22 | 143 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1009 | 2015-07-26 12:23:23 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
$
```
#### F.Y.I
- `-t`
record the calling context of the method `*Test.print`
#### Start Demo
Start `arthas-demo` in [Quick Start](quick-start.md).
#### Record method calls
```bash
$ tt -t demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
```
* `-t`
record the calling context of the method `demo.MathGame primeFactors`
- `-n 3`
* `-n 3`
limit the number of the records (avoid overflow for too many records; with `-n` option, Arthas can automatically stop recording once the records reach the specified limit)
#### Property
* Property
|Name|Specification|
|---|---|
@ -52,7 +54,7 @@ Let's record the whole calling contexts:
|CLASS|class name of the object invoking the method|
|METHOD|method being invoked|
#### Condition expression
* Condition expression
Tips:
1. `tt -t *Test print params[0].length==1` with different amounts of parameters;
@ -64,131 +66,96 @@ Advanced:
* [Special usage](https://github.com/alibaba/arthas/issues/71)
* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
#### List all records
### Searching for records
#### All the recorded
```
```bash
$ tt -l
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1000 | 2015-07-26 01:16:27 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1002 | 2015-07-26 01:16:28 | 119 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1004 | 2015-07-26 12:21:56 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1005 | 2015-07-26 12:21:57 | 138 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1006 | 2015-07-26 12:21:58 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:7) cost in 2 ms.
$
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
9
1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors
Affect(row-cnt:6) cost in 4 ms.
```
#### A specified method
```
$ tt -s method.name=="printAddress"
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:2) cost in 55 ms.
$
#### Searching for records
```bash
$ tt -s 'method.name=="primeFactors"'
INDEX TIMESTAMP COST(ms) IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
1000 2018-12-04 11:15:38 1.096236 false true 0x4b67cf4d MathGame primeFactors
1001 2018-12-04 11:15:39 0.191848 false true 0x4b67cf4d MathGame primeFactors
1002 2018-12-04 11:15:40 0.069523 false true 0x4b67cf4d MathGame primeFactors
1003 2018-12-04 11:15:41 0.186073 false true 0x4b67cf4d MathGame primeFactors
1004 2018-12-04 11:15:42 17.76437 true false 0x4b67cf4d MathGame primeFactors
9
1005 2018-12-04 11:15:43 0.4776 false true 0x4b67cf4d MathGame primeFactors
Affect(row-cnt:6) cost in 607 ms.
```
Advanced:
* [Critical fields in expression](advice-class.md)
### Check context of the call
#### Check context of the call
Using `tt -i <index>` to check a specific calling details.
```
$
```bash
$ tt -i 1003
+-----------------+------------------------------------------------------------------------------------------------------+
| INDEX | 1003 |
+-----------------+------------------------------------------------------------------------------------------------------+
| GMT-CREATE | 2015-07-26 01:16:28 |
+-----------------+------------------------------------------------------------------------------------------------------+
| COST(ms) | 0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(Unknown Source) |
| | at GaOgnlUtilsTest.<init>(Unknown Source) |
| | at GaOgnlUtilsTest.main(Unknown Source) |
+-----------------+------------------------------------------------------------------------------------------------------+
Affect(row-cnt:1) cost in 1 ms.
$
INDEX 1003
GMT-CREATE 2018-12-04 11:15:41
COST(ms) 0.186073
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
IS-RETURN false
IS-EXCEPTION true
PARAMETERS[0] @Integer[-564322413]
THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need >= 2
at demo.MathGame.primeFactors(MathGame.java:46)
at demo.MathGame.run(MathGame.java:24)
at demo.MathGame.main(MathGame.java:16)
Affect(row-cnt:1) cost in 11 ms.
```
### Re-produce
Since Arthas stores the context of the call, you can even *replay* the method calling afterwards with extra option `-p` to re-produce the issue for advanced troubleshooting.
```
$ tt -i 1003 -p
+-----------------+---------------------------------------------------------------------------------------------------------+
| RE-INDEX | 1003 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| GMT-REPLAY | 2015-07-26 17:29:51 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+---------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+---------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+---------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(GaOgnlUtilsTest.java:78) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |
| | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |
| | at java.lang.reflect.Method.invoke(Method.java:483) |
| | at com.github.ompc.Arthas.util.GaMethod.invoke(GaMethod.java:81) |
| | at com.github.ompc.Arthas.command.TimeTunnelCommand$6.action(TimeTunnelCommand.java:592) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.execute(DefaultCommandHandler.java:175) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.executeCommand(DefaultCommandHandler.java:83) |
| | at com.github.ompc.Arthas.server.GaServer$4.run(GaServer.java:329) |
| | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) |
| | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) |
| | at java.lang.Thread.run(Thread.java:745) |
+-----------------+---------------------------------------------------------------------------------------------------------+
replay time fragment[1003] success.
Affect(row-cnt:1) cost in 3 ms.
$
### Replay record
Since Arthas stores the context of the call, you can even *replay* the method calling afterwards with extra option `-p` to replay the issue for advanced troubleshooting.
```bash
$ tt -i 1004 -p
RE-INDEX 1004
GMT-REPLAY 2018-12-04 11:26:00
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
PARAMETERS[0] @Integer[946738738]
IS-RETURN true
IS-EXCEPTION false
RETURN-OBJ @ArrayList[
@Integer[2],
@Integer[11],
@Integer[17],
@Integer[2531387],
]
Time fragment[1004] successfully replayed.
Affect(row-cnt:1) cost in 14 ms.
```
F.Y.I
1. the calling stack is little different using Arthas now unlike the original;
2. **Loss** of the thread local variables will be a undeniable fact since there is no way for Arthas to record the thread local info (*If you find one, please share with us in [issues tracker](https://github.com/alibaba/arthas/issues)*).
3. **Potential** modifications of objects can happen since only a reference will be recorded while later operations might modify objects without Arthas's watch.
1. **Loss** of the `ThreadLocal`
Arthas save params into an array, then invoke the method with the params again. The method execute in another thead, so the `ThreadLocal` **lost**.
1. params may be modified
Arthas save params into an array, they are object references. The Objects may be modified by other code.

@ -37,6 +37,8 @@ Advanced:
### Usage
#### Start Demo
Start `arthas-demo` in [Quick Start](quick-start.md).
#### Check the `out parameters` and `return value`
@ -223,7 +225,7 @@ ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
* `target.field_name`: the field of the current object.
```
```bash
$ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.

@ -97,7 +97,7 @@
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="#check-the-dashboard">3. Check the Dashboard</a></li>
<li class="toctree-l2"><a class="reference internal" href="#get-the-main-class-of-the-process-with-the-thread-command">4. Get the Main Class of the process with the thread command</a></li>
<li class="toctree-l2"><a class="reference internal" href="#get-the-main-class-of-the-arthas-demo-process-with-the-thread-command">4. Get the Main Class of the <code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> process with the thread command</a></li>
<li class="toctree-l2"><a class="reference internal" href="#decompile-main-class-with-jad-command">5. Decompile Main Class with jad command</a></li>
<li class="toctree-l2"><a class="reference internal" href="#watch">6. watch</a></li>
<li class="toctree-l2"><a class="reference internal" href="#exit-arthas">7. Exit Arthas</a></li>
@ -264,10 +264,10 @@ java.home /Library/Java/JavaVir
</pre></div>
</div>
</div>
<div class="section" id="get-the-main-class-of-the-process-with-the-thread-command">
<span id="get-the-main-class-of-the-process-with-the-thread-command"></span><h2>4. Get the Main Class of the process with the thread command<a class="headerlink" href="#get-the-main-class-of-the-process-with-the-thread-command" title="Permalink to this headline"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ thread -n -1 | grep &#39;main(&#39;
at demo.MathGame.main(MathGame.java:17)
<div class="section" id="get-the-main-class-of-the-arthas-demo-process-with-the-thread-command">
<span id="get-the-main-class-of-the-arthas-demo-process-with-the-thread-command"></span><h2>4. Get the Main Class of the <code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> process with the thread command<a class="headerlink" href="#get-the-main-class-of-the-arthas-demo-process-with-the-thread-command" title="Permalink to this headline"></a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ thread -n -1 <span class="p">|</span> grep <span class="s1">&#39;main(&#39;</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:17<span class="o">)</span>
</pre></div>
</div>
</div>

File diff suppressed because one or more lines are too long

@ -111,7 +111,13 @@
<li class="toctree-l2"><a class="reference internal" href="trace.html">trace</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">stack</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#parameters">Parameters</a></li>
<li class="toctree-l3"><a class="reference internal" href="#usage">Usage</a></li>
<li class="toctree-l3"><a class="reference internal" href="#usage">Usage</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#start-demo">Start Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#stack">stack</a></li>
<li class="toctree-l4"><a class="reference internal" href="#filtering-by-condition-expression">Filtering by condition expression</a></li>
<li class="toctree-l4"><a class="reference internal" href="#filtering-by-cost">Filtering by cost</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="tt.html">tt</a></li>
@ -238,86 +244,50 @@
</div>
<div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<blockquote>
<div>Notes: if theres quotes character (say, <code class="docutils literal notranslate"><span class="pre">'</span></code>) in the expression, then the whole expression must be wrapped by quotes but with the other type (in this case, <code class="docutils literal notranslate"><span class="pre">&quot;</span></code>) too. On contrary, its no need to quote the expression itself if theres no quotes character found in it, but it is strongly recommended.</div></blockquote>
<p>Print out calling stack when the first method parameter is “K9-BD-01” for getProductById() method:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack com.alibaba.sample.petstore.dal.dao.ProductDao getProductById <span class="s1">&#39;params[0]==&quot;K9-BD-01&quot;&#39;</span>
<div class="section" id="start-demo">
<span id="start-demo"></span><h3>Start Demo<a class="headerlink" href="#start-demo" title="Permalink to this headline"></a></h3>
<p>Start <code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> in <a class="reference internal" href="quick-start.html"><span class="doc">Quick Start</span></a>.</p>
</div>
<div class="section" id="stack">
<span id="id1"></span><h3>stack<a class="headerlink" href="#stack" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">36</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:32:19<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
</pre></div>
</div>
</div>
<div class="section" id="filtering-by-condition-expression">
<span id="filtering-by-condition-expression"></span><h3>Filtering by condition expression<a class="headerlink" href="#filtering-by-condition-expression" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack demo.MathGame primeFactors <span class="s1">&#39;params[0]&lt;0&#39;</span> -n <span class="m">2</span>
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">51</span> ms.
<span class="nv">thread_name</span><span class="o">=</span><span class="s2">&quot;http-bio-8080-exec-4&quot;</span> <span class="nv">thread_id</span><span class="o">=</span>0x4a<span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>true<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span>
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById<span class="o">()</span>
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute<span class="o">(</span>ItemList.java:50<span class="o">)</span>
at com.alibaba.sample.petstore.web.store.module.screen.ItemList<span class="nv">$$</span>FastClassByCGLIB<span class="nv">$$</span>40b2f45f.invoke<span class="o">(</span>&lt;generated&gt;:-1<span class="o">)</span>
at net.sf.cglib.reflect.FastMethod.invoke<span class="o">(</span>FastMethod.java:53<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke<span class="o">(</span>MethodInvoker.java:70<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn<span class="o">(</span>DataBindingAdapter.java:41<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule<span class="o">(</span>PerformScreenValve.java:111<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke<span class="o">(</span>PerformScreenValve.java:74<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke<span class="o">(</span>PerformActionValve.java:73<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invoke<span class="o">(</span>PipelineImpl.java:210<span class="o">)</span>
......
<span class="nv">thread_name</span><span class="o">=</span><span class="s2">&quot;http-bio-8080-exec-2&quot;</span> <span class="nv">thread_id</span><span class="o">=</span>0x48<span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>true<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span>
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById<span class="o">()</span>
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute<span class="o">(</span>ItemList.java:50<span class="o">)</span>
at com.alibaba.sample.petstore.web.store.module.screen.ItemList<span class="nv">$$</span>FastClassByCGLIB<span class="nv">$$</span>40b2f45f.invoke<span class="o">(</span>&lt;generated&gt;:-1<span class="o">)</span>
at net.sf.cglib.reflect.FastMethod.invoke<span class="o">(</span>FastMethod.java:53<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke<span class="o">(</span>MethodInvoker.java:70<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn<span class="o">(</span>DataBindingAdapter.java:41<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule<span class="o">(</span>PerformScreenValve.java:111<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke<span class="o">(</span>PerformScreenValve.java:74<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke<span class="o">(</span>PerformActionValve.java:73<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invoke<span class="o">(</span>PipelineImpl.java:210<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke<span class="o">(</span>ChooseValve.java:98<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
...
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">30</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:34:27<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:34:30<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
Command execution <span class="nb">times</span> exceed limit: <span class="m">2</span>, so <span class="nb">command</span> will exit. You can <span class="nb">set</span> it with -n option.
</pre></div>
</div>
<p>Print out the calling stack when method execute() takes more than 30ms to finish:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="c1">#cost&gt;30</span>
</div>
<div class="section" id="filtering-by-cost">
<span id="filtering-by-cost"></span><h3>Filtering by cost<a class="headerlink" href="#filtering-by-cost" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack demo.MathGame primeFactors <span class="s1">&#39;#cost&gt;5&#39;</span>
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">123</span> ms.
stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="c1">#cost&gt;30</span>
<span class="nv">thread_name</span><span class="o">=</span>http-nio-8080-exec-10<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">31</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>true<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
@com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute<span class="o">()</span>
at com.alibaba.sample.petstore.web.store.module.screen.ItemList<span class="nv">$$</span>FastClassByCGLIB<span class="nv">$$</span>40b2f45f.invoke<span class="o">(</span>&lt;generated&gt;:-1<span class="o">)</span>
at net.sf.cglib.reflect.FastMethod.invoke<span class="o">(</span>FastMethod.java:53<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke<span class="o">(</span>MethodInvoker.java:70<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn<span class="o">(</span>DataBindingAdapter.java:41<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule<span class="o">(</span>PerformScreenValve.java:111<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke<span class="o">(</span>PerformScreenValve.java:74<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke<span class="o">(</span>PerformActionValve.java:73<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invoke<span class="o">(</span>PipelineImpl.java:210<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke<span class="o">(</span>ChooseValve.java:98<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invoke<span class="o">(</span>PipelineImpl.java:210<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invokeBody<span class="o">(</span>LoopValve.java:105<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invoke<span class="o">(</span>LoopValve.java:83<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.invoke<span class="o">(</span>PageAuthorizationValve.java:105<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.CheckCsrfTokenValve.invoke<span class="o">(</span>CheckCsrfTokenValve.java:123<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.AnalyzeURLValve.invoke<span class="o">(</span>AnalyzeURLValve.java:126<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.SetLoggingContextValve.invoke<span class="o">(</span>SetLoggingContextValve.java:66<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PrepareForTurbineValve.invoke<span class="o">(</span>PrepareForTurbineValve.java:52<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invokeNext<span class="o">(</span>PipelineImpl.java:157<span class="o">)</span>
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl<span class="nv">$PipelineContextImpl</span>.invoke<span class="o">(</span>PipelineImpl.java:210<span class="o">)</span>
at com.alibaba.citrus.webx.impl.WebxControllerImpl.service<span class="o">(</span>WebxControllerImpl.java:43<span class="o">)</span>
at com.alibaba.citrus.webx.impl.WebxRootControllerImpl.handleRequest<span class="o">(</span>WebxRootControllerImpl.java:53<span class="o">)</span>
at com.alibaba.citrus.webx.support.AbstractWebxRootController.service<span class="o">(</span>AbstractWebxRootController.java:165<span class="o">)</span>
...
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">35</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:35:58<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
</pre></div>
</div>
</div>
</div>
</div>

@ -111,7 +111,13 @@
<li class="toctree-l2 current"><a class="current reference internal" href="#">trace</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#parameters">Parameters</a></li>
<li class="toctree-l3"><a class="reference internal" href="#notice">Notice</a></li>
<li class="toctree-l3"><a class="reference internal" href="#usage">Usage</a></li>
<li class="toctree-l3"><a class="reference internal" href="#usage">Usage</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#start-demo">Start Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#trace-method">trace method</a></li>
<li class="toctree-l4"><a class="reference internal" href="#ignore-jdk-method">Ignore jdk method</a></li>
<li class="toctree-l4"><a class="reference internal" href="#filtering-by-cost">Filtering by cost</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="stack.html">stack</a></li>
@ -240,14 +246,9 @@
<li>Pls. also refer to <a class="reference external" href="https://github.com/alibaba/arthas/issues/71">https://github.com/alibaba/arthas/issues/71</a> for more advanced usage</li>
<li>OGNL official site: <a class="reference external" href="https://commons.apache.org/proper/commons-ognl/language-guide.html">https://commons.apache.org/proper/commons-ognl/language-guide.html</a></li>
</ul>
<p>Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: <code class="docutils literal notranslate"><span class="pre">trace</span> <span class="pre">*StringUtils</span> <span class="pre">isBlank</span> <span class="pre">'$cost&gt;100'</span></code> means trace result will only be output when the executing time exceeds 100ms.</p>
<p>Many times what we are interested is the exact trace result when the method call takes time over one particular period. It is possible to achieve this in Arthas, for example: <code class="docutils literal notranslate"><span class="pre">trace</span> <span class="pre">*StringUtils</span> <span class="pre">isBlank</span> <span class="pre">'#cost&gt;100'</span></code> means trace result will only be output when the executing time exceeds 100ms.</p>
<blockquote>
<div><p>Notes:</p>
<ol class="simple">
<li><code class="docutils literal notranslate"><span class="pre">watch</span></code>/<code class="docutils literal notranslate"><span class="pre">stack</span></code>/<code class="docutils literal notranslate"><span class="pre">trace</span></code>, these three commands all support <code class="docutils literal notranslate"><span class="pre">$cost</span></code>.</li>
<li>On version <code class="docutils literal notranslate"><span class="pre">3.0</span></code>, pls. use <code class="docutils literal notranslate"><span class="pre">#cost</span></code> instead of <code class="docutils literal notranslate"><span class="pre">$cost</span></code>.</li>
</ol>
</div></blockquote>
<div><code class="docutils literal notranslate"><span class="pre">watch</span></code>/<code class="docutils literal notranslate"><span class="pre">stack</span></code>/<code class="docutils literal notranslate"><span class="pre">trace</span></code>, these three commands all support <code class="docutils literal notranslate"><span class="pre">#cost</span></code>.</div></blockquote>
</div>
<div class="section" id="notice">
<span id="notice"></span><h2>Notice<a class="headerlink" href="#notice" title="Permalink to this headline"></a></h2>
@ -255,76 +256,60 @@
</div>
<div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<p>Sample code:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
<span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;a&quot;</span><span class="o">);</span>
<span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;b&quot;</span><span class="o">);</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
<span class="n">list2</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;c&quot;</span><span class="o">);</span>
<span class="n">list2</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;d&quot;</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">list</span><span class="o">,</span> <span class="n">list2</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span> <span class="nf">add</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list</span><span class="o">,</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list2</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>
<span class="k">while</span> <span class="o">(</span><span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">hehe</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="o">)</span> <span class="o">{</span>
<span class="n">t</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="n">i</span><span class="o">--;</span>
<span class="o">}</span>
<span class="n">list</span><span class="o">.</span><span class="na">addAll</span><span class="o">(</span><span class="n">list2</span><span class="o">);</span>
<span class="k">return</span> <span class="n">list</span><span class="o">.</span><span class="na">size</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">hehe</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="n">RuntimeException</span><span class="o">(</span><span class="s">&quot;ZERO&quot;</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<div class="section" id="start-demo">
<span id="start-demo"></span><h3>Start Demo<a class="headerlink" href="#start-demo" title="Permalink to this headline"></a></h3>
<p>Start <code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> in <a class="reference internal" href="quick-start.html"><span class="doc">Quick Start</span></a>.</p>
</div>
<div class="section" id="trace-method">
<span id="trace-method"></span><h3>trace method<a class="headerlink" href="#trace-method" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">42</span> ms.
<span class="sb">`</span>---ts<span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">00</span>:44:17<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="sb">`</span>---<span class="o">[</span><span class="m">10</span>.611029ms<span class="o">]</span> demo.MathGame:run<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.05638ms<span class="o">]</span> java.util.Random:nextInt<span class="o">()</span>
+---<span class="o">[</span><span class="m">10</span>.036885ms<span class="o">]</span> demo.MathGame:primeFactors<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="m">0</span>.170316ms<span class="o">]</span> demo.MathGame:print<span class="o">()</span>
</pre></div>
</div>
<p>Trace down method <code class="docutils literal notranslate"><span class="pre">add</span></code>:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList add params.length<span class="o">==</span><span class="m">2</span>
</div>
<div class="section" id="ignore-jdk-method">
<span id="ignore-jdk-method"></span><h3>Ignore jdk method<a class="headerlink" href="#ignore-jdk-method" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace -j demo.MathGame run
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">144</span> ms.
<span class="sb">`</span>---Tracing...
<span class="sb">`</span>---<span class="o">[</span>2ms<span class="o">]</span>com.alibaba.sample.petstore.web.store.module.screen.ItemList:add<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>,0,0ms,11<span class="o">]</span>com.alibaba.sample.petstore.web.store.module.screen.ItemList:hehe<span class="o">()</span> <span class="o">[</span>throws Exception<span class="o">]</span>
+---<span class="o">[</span>1ms<span class="o">]</span>java.lang.Throwable:printStackTrace<span class="o">()</span>
+---<span class="o">[</span>0ms<span class="o">]</span>java.util.List:addAll<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span>0ms<span class="o">]</span>java.util.List:size<span class="o">()</span>
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">31</span> ms.
<span class="sb">`</span>---ts<span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:09:14<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="sb">`</span>---<span class="o">[</span><span class="m">5</span>.190646ms<span class="o">]</span> demo.MathGame:run<span class="o">()</span>
+---<span class="o">[</span><span class="m">4</span>.465779ms<span class="o">]</span> demo.MathGame:primeFactors<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="m">0</span>.375324ms<span class="o">]</span> demo.MathGame:print<span class="o">()</span>
</pre></div>
</div>
<p>Filter by time cost:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="c1">#cost&gt;4</span>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">-j</span></code>: jdkMethodSkip, skip jdk method trace</li>
</ul>
</div>
<div class="section" id="filtering-by-cost">
<span id="filtering-by-cost"></span><h3>Filtering by cost<a class="headerlink" href="#filtering-by-cost" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace demo.MathGame run <span class="s1">&#39;#cost &gt; 10&#39;</span>
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">159</span> ms.
trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="c1">#cost&gt;4</span>
<span class="sb">`</span>---thread_name<span class="o">=</span>http-nio-8080-exec-5<span class="p">;</span><span class="nv">id</span><span class="o">=</span>2c<span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>true<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
<span class="sb">`</span>---<span class="o">[</span><span class="m">8</span>.866586ms<span class="o">]</span> com.alibaba.sample.petstore.web.store.module.screen.ItemList:execute<span class="o">()</span>
+---<span class="o">[</span><span class="m">2</span>.847106ms<span class="o">]</span> com.alibaba.sample.petstore.biz.StoreManager:getAllProductItems<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.765544ms<span class="o">]</span> com.alibaba.sample.petstore.dal.dao.ProductDao:getProductById<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.021204ms<span class="o">]</span> com.alibaba.sample.petstore.dal.dataobject.Product:getCategoryId<span class="o">()</span>
+---<span class="o">[</span><span class="m">1</span>.341532ms<span class="o">]</span> com.alibaba.sample.petstore.dal.dao.CategoryDao:getCategoryById<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="nv">min</span><span class="o">=</span><span class="m">0</span>.005428ms,max<span class="o">=</span><span class="m">0</span>.094064ms,total<span class="o">=</span><span class="m">0</span>.105228ms,count<span class="o">=</span><span class="m">3</span><span class="o">]</span> com.alibaba.citrus.turbine.Context:put<span class="o">()</span>
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">41</span> ms.
<span class="sb">`</span>---ts<span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:12:02<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="sb">`</span>---<span class="o">[</span><span class="m">12</span>.033735ms<span class="o">]</span> demo.MathGame:run<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.006783ms<span class="o">]</span> java.util.Random:nextInt<span class="o">()</span>
+---<span class="o">[</span><span class="m">11</span>.852594ms<span class="o">]</span> demo.MathGame:primeFactors<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="m">0</span>.05447ms<span class="o">]</span> demo.MathGame:print<span class="o">()</span>
</pre></div>
</div>
<blockquote>
<div>Only the call path whichs time cost is higher than <code class="docutils literal notranslate"><span class="pre">4ms</span></code> will be shown. This feature is handy to focus on whats needed to focus when troubleshoot.</div></blockquote>
<div>Only the call path whichs time cost is higher than <code class="docutils literal notranslate"><span class="pre">10ms</span></code> will be shown. This feature is handy to focus on whats needed to focus when troubleshoot.</div></blockquote>
<ul class="simple">
<li>Here Arthas provides the similar functionality JProfile and other commercial software provide. Compared to these professional softwares, Arthas doesnt deduce the time cost <code class="docutils literal notranslate"><span class="pre">trace</span></code> itself takes, therefore it is not as accurate as these softwares offer. More classes and methods on the calling path, more inaccurate <code class="docutils literal notranslate"><span class="pre">trace</span></code> output is, but it is still helpful for diagnostics where the bottleneck is.</li>
<li>“[2.847106ms] com.alibaba.sample.petstore.biz.StoreManager:getAllProductItems()” means “getAllProductItem()” method from “com.alibaba.sample.petstore.biz.StoreManager” takes <code class="docutils literal notranslate"><span class="pre">2.847106</span></code> ms.</li>
<li>“[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] com.alibaba.citrus.turbine.Context:put()” means aggregating all same method calls into one single line. The minimum time cost is <code class="docutils literal notranslate"><span class="pre">0.005428</span></code> ms, the maximum time cost is <code class="docutils literal notranslate"><span class="pre">0.094064</span></code> ms, and the total time cost for all method calls (<code class="docutils literal notranslate"><span class="pre">3</span></code> times in total) to “com.alibaba.citrus.turbine.Context:put()” is <code class="docutils literal notranslate"><span class="pre">0.105228ms</span></code>. If “throws Exception” appears in this line, it means some exceptions have been thrown from this method calls.</li>
<li>“[12.033735ms]” means the method on the node takes <code class="docutils literal notranslate"><span class="pre">12.033735</span></code> ms.</li>
<li>“[min=0.005428ms,max=0.094064ms,total=0.105228ms,count=3] demo:call()” means aggregating all same method calls into one single line. The minimum time cost is <code class="docutils literal notranslate"><span class="pre">0.005428</span></code> ms, the maximum time cost is <code class="docutils literal notranslate"><span class="pre">0.094064</span></code> ms, and the total time cost for all method calls (<code class="docutils literal notranslate"><span class="pre">3</span></code> times in total) to “demo:call()” is <code class="docutils literal notranslate"><span class="pre">0.105228ms</span></code>. If “throws Exception” appears in this line, it means some exceptions have been thrown from this method calls.</li>
<li>The total time cost may not equal to the sum of the time costs each sub method call takes, this is because Arthas instrumented code takes time too.</li>
</ul>
</div>
</div>
</div>

@ -112,18 +112,14 @@
<li class="toctree-l2"><a class="reference internal" href="stack.html">stack</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">tt</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#usage">Usage</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#f-y-i">F.Y.I</a></li>
<li class="toctree-l4"><a class="reference internal" href="#property">Property</a></li>
<li class="toctree-l4"><a class="reference internal" href="#condition-expression">Condition expression</a></li>
<li class="toctree-l4"><a class="reference internal" href="#start-demo">Start Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#record-method-calls">Record method calls</a></li>
<li class="toctree-l4"><a class="reference internal" href="#list-all-records">List all records</a></li>
<li class="toctree-l4"><a class="reference internal" href="#searching-for-records">Searching for records</a></li>
<li class="toctree-l4"><a class="reference internal" href="#check-context-of-the-call">Check context of the call</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#searching-for-records">Searching for records</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#all-the-recorded">All the recorded</a></li>
<li class="toctree-l4"><a class="reference internal" href="#a-specified-method">A specified method</a></li>
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#check-context-of-the-call">Check context of the call</a></li>
<li class="toctree-l3"><a class="reference internal" href="#re-produce">Re-produce</a></li>
<li class="toctree-l3"><a class="reference internal" href="#replay-record">Replay record</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="options.html">options</a></li>
@ -211,35 +207,34 @@
<p>With the help of <code class="docutils literal notranslate"><span class="pre">tt</span></code> (<em>TimeTunnel</em>), you can check the contexts of the methods at different times in execution history.</p>
<div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<p>Lets record the whole calling contexts:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">$</span> <span class="n">tt</span> <span class="o">-</span><span class="n">t</span> <span class="o">-</span><span class="n">n</span> <span class="mi">3</span> <span class="o">*</span><span class="n">Test</span> <span class="n">print</span>
<span class="n">Press</span> <span class="n">Ctrl</span><span class="o">+</span><span class="n">D</span> <span class="n">or</span> <span class="n">Ctrl</span><span class="o">+</span><span class="n">X</span> <span class="n">to</span> <span class="n">abort</span><span class="o">.</span>
<span class="nf">Affect</span><span class="o">(</span><span class="n">class</span><span class="o">-</span><span class="n">cnt</span><span class="o">:</span><span class="mi">1</span> <span class="o">,</span> <span class="n">method</span><span class="o">-</span><span class="n">cnt</span><span class="o">:</span><span class="mi">1</span><span class="o">)</span> <span class="n">cost</span> <span class="n">in</span> <span class="mi">115</span> <span class="n">ms</span><span class="o">.</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="n">INDEX</span> <span class="o">|</span> <span class="n">TIMESTAMP</span> <span class="o">|</span> <span class="n">COST</span><span class="o">(</span><span class="n">ms</span><span class="o">)</span> <span class="o">|</span> <span class="n">IS</span><span class="o">-</span><span class="n">RET</span> <span class="o">|</span> <span class="n">IS</span><span class="o">-</span><span class="n">EXP</span> <span class="o">|</span> <span class="n">OBJECT</span> <span class="o">|</span> <span class="n">CLASS</span> <span class="o">|</span> <span class="n">METHOD</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="mi">1007</span> <span class="o">|</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">07</span><span class="o">-</span><span class="mi">26</span> <span class="mi">12</span><span class="o">:</span><span class="mi">23</span><span class="o">:</span><span class="mi">21</span> <span class="o">|</span> <span class="mi">138</span> <span class="o">|</span> <span class="kc">true</span> <span class="o">|</span> <span class="kc">false</span> <span class="o">|</span> <span class="mh">0x42cc13a0</span> <span class="o">|</span> <span class="n">GaOgnlUtilsTest</span> <span class="o">|</span> <span class="n">print</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="mi">1008</span> <span class="o">|</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">07</span><span class="o">-</span><span class="mi">26</span> <span class="mi">12</span><span class="o">:</span><span class="mi">23</span><span class="o">:</span><span class="mi">22</span> <span class="o">|</span> <span class="mi">143</span> <span class="o">|</span> <span class="kc">true</span> <span class="o">|</span> <span class="kc">false</span> <span class="o">|</span> <span class="mh">0x42cc13a0</span> <span class="o">|</span> <span class="n">GaOgnlUtilsTest</span> <span class="o">|</span> <span class="n">print</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="mi">1009</span> <span class="o">|</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">07</span><span class="o">-</span><span class="mi">26</span> <span class="mi">12</span><span class="o">:</span><span class="mi">23</span><span class="o">:</span><span class="mi">23</span> <span class="o">|</span> <span class="mi">130</span> <span class="o">|</span> <span class="kc">true</span> <span class="o">|</span> <span class="kc">false</span> <span class="o">|</span> <span class="mh">0x42cc13a0</span> <span class="o">|</span> <span class="n">GaOgnlUtilsTest</span> <span class="o">|</span> <span class="n">print</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="n">$</span>
<div class="section" id="start-demo">
<span id="start-demo"></span><h3>Start Demo<a class="headerlink" href="#start-demo" title="Permalink to this headline"></a></h3>
<p>Start <code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> in <a class="reference internal" href="quick-start.html"><span class="doc">Quick Start</span></a>.</p>
</div>
<div class="section" id="record-method-calls">
<span id="record-method-calls"></span><h3>Record method calls<a class="headerlink" href="#record-method-calls" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -t demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">66</span> ms.
INDEX TIMESTAMP COST<span class="o">(</span>ms<span class="o">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="m">1000</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:38 <span class="m">1</span>.096236 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1001</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:39 <span class="m">0</span>.191848 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1002</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:40 <span class="m">0</span>.069523 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1003</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41 <span class="m">0</span>.186073 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1004</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:42 <span class="m">17</span>.76437 <span class="nb">true</span> <span class="nb">false</span> 0x4b67cf4d MathGame primeFactors
</pre></div>
</div>
<div class="section" id="f-y-i">
<span id="f-y-i"></span><h3>F.Y.I<a class="headerlink" href="#f-y-i" title="Permalink to this headline"></a></h3>
<ul>
<li><p class="first"><code class="docutils literal notranslate"><span class="pre">-t</span></code></p>
<p>record the calling context of the method <code class="docutils literal notranslate"><span class="pre">*Test.print</span></code></p>
<p>record the calling context of the method <code class="docutils literal notranslate"><span class="pre">demo.MathGame</span> <span class="pre">primeFactors</span></code></p>
</li>
<li><p class="first"><code class="docutils literal notranslate"><span class="pre">-n</span> <span class="pre">3</span></code></p>
<p>limit the number of the records (avoid overflow for too many records; with <code class="docutils literal notranslate"><span class="pre">-n</span></code> option, Arthas can automatically stop recording once the records reach the specified limit)</p>
</li>
<li><p class="first">Property</p>
</li>
</ul>
</div>
<div class="section" id="property">
<span id="property"></span><h3>Property<a class="headerlink" href="#property" title="Permalink to this headline"></a></h3>
<table border="1" class="docutils">
<thead>
<tr>
@ -281,9 +276,9 @@
<td>method being invoked</td>
</tr>
</tbody>
</table></div>
<div class="section" id="condition-expression">
<span id="condition-expression"></span><h3>Condition expression<a class="headerlink" href="#condition-expression" title="Permalink to this headline"></a></h3>
</table><ul class="simple">
<li>Condition expression</li>
</ul>
<p>Tips:</p>
<ol class="simple">
<li><code class="docutils literal notranslate"><span class="pre">tt</span> <span class="pre">-t</span> <span class="pre">*Test</span> <span class="pre">print</span> <span class="pre">params[0].length==1</span></code> with different amounts of parameters;</li>
@ -299,46 +294,35 @@
</ul>
</div>
</div>
</div>
<div class="section" id="searching-for-records">
<span id="searching-for-records"></span><h2>Searching for records<a class="headerlink" href="#searching-for-records" title="Permalink to this headline"></a></h2>
<div class="section" id="all-the-recorded">
<span id="all-the-recorded"></span><h3>All the recorded<a class="headerlink" href="#all-the-recorded" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -l
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1000 | 2015-07-26 01:16:27 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1002 | 2015-07-26 01:16:28 | 119 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1004 | 2015-07-26 12:21:56 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1005 | 2015-07-26 12:21:57 | 138 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1006 | 2015-07-26 12:21:58 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:7) cost in 2 ms.
$
<div class="section" id="list-all-records">
<span id="list-all-records"></span><h3>List all records<a class="headerlink" href="#list-all-records" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -l
INDEX TIMESTAMP COST<span class="o">(</span>ms<span class="o">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="m">1000</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:38 <span class="m">1</span>.096236 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1001</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:39 <span class="m">0</span>.191848 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1002</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:40 <span class="m">0</span>.069523 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1003</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41 <span class="m">0</span>.186073 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1004</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:42 <span class="m">17</span>.76437 <span class="nb">true</span> <span class="nb">false</span> 0x4b67cf4d MathGame primeFactors
<span class="m">9</span>
<span class="m">1005</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:43 <span class="m">0</span>.4776 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
Affect<span class="o">(</span>row-cnt:6<span class="o">)</span> cost in <span class="m">4</span> ms.
</pre></div>
</div>
</div>
<div class="section" id="a-specified-method">
<span id="a-specified-method"></span><h3>A specified method<a class="headerlink" href="#a-specified-method" title="Permalink to this headline"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -s method.name==&quot;printAddress&quot;
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:2) cost in 55 ms.
$
<div class="section" id="searching-for-records">
<span id="searching-for-records"></span><h3>Searching for records<a class="headerlink" href="#searching-for-records" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -s <span class="s1">&#39;method.name==&quot;primeFactors&quot;&#39;</span>
INDEX TIMESTAMP COST<span class="o">(</span>ms<span class="o">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="m">1000</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:38 <span class="m">1</span>.096236 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1001</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:39 <span class="m">0</span>.191848 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1002</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:40 <span class="m">0</span>.069523 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1003</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41 <span class="m">0</span>.186073 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1004</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:42 <span class="m">17</span>.76437 <span class="nb">true</span> <span class="nb">false</span> 0x4b67cf4d MathGame primeFactors
<span class="m">9</span>
<span class="m">1005</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:43 <span class="m">0</span>.4776 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
Affect<span class="o">(</span>row-cnt:6<span class="o">)</span> cost in <span class="m">607</span> ms.
</pre></div>
</div>
<p>Advanced:</p>
@ -348,87 +332,59 @@ $
</ul>
</div>
</div>
</div>
<div class="section" id="check-context-of-the-call">
<span id="check-context-of-the-call"></span><h2>Check context of the call<a class="headerlink" href="#check-context-of-the-call" title="Permalink to this headline"></a></h2>
<span id="check-context-of-the-call"></span><h3>Check context of the call<a class="headerlink" href="#check-context-of-the-call" title="Permalink to this headline"></a></h3>
<p>Using <code class="docutils literal notranslate"><span class="pre">tt</span> <span class="pre">-i</span> <span class="pre">&lt;index&gt;</span></code> to check a specific calling details.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$
$ tt -i 1003
+-----------------+------------------------------------------------------------------------------------------------------+
| INDEX | 1003 |
+-----------------+------------------------------------------------------------------------------------------------------+
| GMT-CREATE | 2015-07-26 01:16:28 |
+-----------------+------------------------------------------------------------------------------------------------------+
| COST(ms) | 0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(Unknown Source) |
| | at GaOgnlUtilsTest.&lt;init&gt;(Unknown Source) |
| | at GaOgnlUtilsTest.main(Unknown Source) |
+-----------------+------------------------------------------------------------------------------------------------------+
Affect(row-cnt:1) cost in 1 ms.
$
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -i <span class="m">1003</span>
INDEX <span class="m">1003</span>
GMT-CREATE <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41
COST<span class="o">(</span>ms<span class="o">)</span> <span class="m">0</span>.186073
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
IS-RETURN <span class="nb">false</span>
IS-EXCEPTION <span class="nb">true</span>
PARAMETERS<span class="o">[</span><span class="m">0</span><span class="o">]</span> @Integer<span class="o">[</span>-564322413<span class="o">]</span>
THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need &gt;<span class="o">=</span> <span class="m">2</span>
at demo.MathGame.primeFactors<span class="o">(</span>MathGame.java:46<span class="o">)</span>
at demo.MathGame.run<span class="o">(</span>MathGame.java:24<span class="o">)</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">11</span> ms.
</pre></div>
</div>
</div>
<div class="section" id="re-produce">
<span id="re-produce"></span><h2>Re-produce<a class="headerlink" href="#re-produce" title="Permalink to this headline"></a></h2>
<p>Since Arthas stores the context of the call, you can even <em>replay</em> the method calling afterwards with extra option <code class="docutils literal notranslate"><span class="pre">-p</span></code> to re-produce the issue for advanced troubleshooting.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -i 1003 -p
+-----------------+---------------------------------------------------------------------------------------------------------+
| RE-INDEX | 1003 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| GMT-REPLAY | 2015-07-26 17:29:51 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+---------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+---------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+---------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(GaOgnlUtilsTest.java:78) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |
| | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |
| | at java.lang.reflect.Method.invoke(Method.java:483) |
| | at com.github.ompc.Arthas.util.GaMethod.invoke(GaMethod.java:81) |
| | at com.github.ompc.Arthas.command.TimeTunnelCommand$6.action(TimeTunnelCommand.java:592) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.execute(DefaultCommandHandler.java:175) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.executeCommand(DefaultCommandHandler.java:83) |
| | at com.github.ompc.Arthas.server.GaServer$4.run(GaServer.java:329) |
| | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) |
| | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) |
| | at java.lang.Thread.run(Thread.java:745) |
+-----------------+---------------------------------------------------------------------------------------------------------+
replay time fragment[1003] success.
Affect(row-cnt:1) cost in 3 ms.
$
</div>
<div class="section" id="replay-record">
<span id="replay-record"></span><h2>Replay record<a class="headerlink" href="#replay-record" title="Permalink to this headline"></a></h2>
<p>Since Arthas stores the context of the call, you can even <em>replay</em> the method calling afterwards with extra option <code class="docutils literal notranslate"><span class="pre">-p</span></code> to replay the issue for advanced troubleshooting.</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -i <span class="m">1004</span> -p
RE-INDEX <span class="m">1004</span>
GMT-REPLAY <span class="m">2018</span>-12-04 <span class="m">11</span>:26:00
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
PARAMETERS<span class="o">[</span><span class="m">0</span><span class="o">]</span> @Integer<span class="o">[</span><span class="m">946738738</span><span class="o">]</span>
IS-RETURN <span class="nb">true</span>
IS-EXCEPTION <span class="nb">false</span>
RETURN-OBJ @ArrayList<span class="o">[</span>
@Integer<span class="o">[</span><span class="m">2</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">11</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">17</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">2531387</span><span class="o">]</span>,
<span class="o">]</span>
Time fragment<span class="o">[</span><span class="m">1004</span><span class="o">]</span> successfully replayed.
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">14</span> ms.
</pre></div>
</div>
<p>F.Y.I</p>
<ol class="simple">
<li>the calling stack is little different using Arthas now unlike the original;</li>
<li><strong>Loss</strong> of the thread local variables will be a undeniable fact since there is no way for Arthas to record the thread local info (<em>If you find one, please share with us in <a class="reference external" href="https://github.com/alibaba/arthas/issues">issues tracker</a></em>).</li>
<li><strong>Potential</strong> modifications of objects can happen since only a reference will be recorded while later operations might modify objects without Arthass watch.</li>
<ol>
<li><p class="first"><strong>Loss</strong> of the <code class="docutils literal notranslate"><span class="pre">ThreadLocal</span></code></p>
<p>Arthas save params into an array, then invoke the method with the params again. The method execute in another thead, so the <code class="docutils literal notranslate"><span class="pre">ThreadLocal</span></code> <strong>lost</strong>.</p>
</li>
<li><p class="first">params may be modified</p>
<p>Arthas save params into an array, they are object references. The Objects may be modified by other code.</p>
</li>
</ol>
</div>
</div>

@ -115,6 +115,7 @@
</ul>
</li>
<li class="toctree-l3"><a class="reference internal" href="#usage">Usage</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#start-demo">Start Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#check-the-out-parameters-and-return-value">Check the <code class="docutils literal notranslate"><span class="pre">out</span> <span class="pre">parameters</span></code> and <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">value</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#check-in-parameters">Check <code class="docutils literal notranslate"><span class="pre">in</span> <span class="pre">parameters</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#check-before-and-after-at-the-same-time">Check <em>before</em> and <em>after</em> at the same time</a></li>
@ -282,7 +283,10 @@
</div>
<div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<div class="section" id="start-demo">
<span id="start-demo"></span><h3>Start Demo<a class="headerlink" href="#start-demo" title="Permalink to this headline"></a></h3>
<p>Start <code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> in <a class="reference internal" href="quick-start.html"><span class="doc">Quick Start</span></a>.</p>
</div>
<div class="section" id="check-the-out-parameters-and-return-value">
<span id="check-the-out-parameters-and-return-value"></span><h3>Check the <code class="docutils literal notranslate"><span class="pre">out</span> <span class="pre">parameters</span></code> and <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">value</span></code><a class="headerlink" href="#check-the-out-parameters-and-return-value" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span>
@ -468,11 +472,11 @@ Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">target.field_name</span></code>: the field of the current object.</li>
</ul>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors &#39;target.illegalArgumentCount&#39;
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s1">&#39;target.illegalArgumentCount&#39;</span>
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">67</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">20</span>:04:34<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">131</span>.303498ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">8</span><span class="o">]</span>
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">20</span>:04:35<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.961441ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">8</span><span class="o">]</span>
</pre></div>
</div>
</div>

@ -168,7 +168,6 @@
<div class="section" id="arthas">
<span id="arthas"></span><h1>Arthas 用户文档<a class="headerlink" href="#arthas" title="永久链接至标题"></a></h1>
<p><strong><a class="reference external" href="https://alibaba.github.io/arthas/en/">English Docs</a></strong></p>
<p><strong>Arthas正在参加“2018年度最受欢迎中国开源软件评选” 请支持Arthas<a class="reference external" href="https://www.oschina.net/project/top_cn_2018">投票地址</a></strong></p>
<div class="section" id="arthas">
<span id="id1"></span><h2>Arthas阿尔萨斯 能为你做什么?<a class="headerlink" href="#arthas" title="永久链接至标题"></a></h2>
<p><img alt="arthas" src="_images/arthas.png" /></p>

@ -95,7 +95,7 @@
<li class="toctree-l2"><a class="reference internal" href="#demo">1. 启动Demo</a></li>
<li class="toctree-l2"><a class="reference internal" href="#arthas">2. 启动arthas</a></li>
<li class="toctree-l2"><a class="reference internal" href="#dashboard">3. 查看dashboard</a></li>
<li class="toctree-l2"><a class="reference internal" href="#threadmain-class">4. 通过thread命令来获取到进程的Main Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="#threadarthas-demomain-class">4. 通过thread命令来获取到<code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code>进程的Main Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="#jadmain-class">5. 通过jad来反编绎Main Class</a></li>
<li class="toctree-l2"><a class="reference internal" href="#watch">6. watch</a></li>
<li class="toctree-l2"><a class="reference internal" href="#arthas">5. 退出arthas</a></li>
@ -179,8 +179,8 @@
<span id="id1"></span><h1>快速入门<a class="headerlink" href="#" title="永久链接至标题"></a></h1>
<div class="section" id="demo">
<span id="demo"></span><h2>1. 启动Demo<a class="headerlink" href="#demo" title="永久链接至标题"></a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>wget https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://alibaba.github.io/arthas/arthas-demo.jar
$ java -jar arthas-demo.jar
</pre></div>
</div>
<p><code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code>是一个简单的程序,每隔一秒生成一个随机数,再执行质因式分解,并打印出分解结果。</p>
@ -261,10 +261,10 @@ java.home /Library/Java/JavaVir
</pre></div>
</div>
</div>
<div class="section" id="threadmain-class">
<span id="threadmain-class"></span><h2>4. 通过thread命令来获取到进程的Main Class<a class="headerlink" href="#threadmain-class" title="永久链接至标题"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ thread -n -1 | grep &#39;main(&#39;
at demo.MathGame.main(MathGame.java:17)
<div class="section" id="threadarthas-demomain-class">
<span id="threadarthas-demomain-class"></span><h2>4. 通过thread命令来获取到<code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code>进程的Main Class<a class="headerlink" href="#threadarthas-demomain-class" title="永久链接至标题"></a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ thread -n -1 <span class="p">|</span> grep <span class="s1">&#39;main(&#39;</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:17<span class="o">)</span>
</pre></div>
</div>
</div>

File diff suppressed because one or more lines are too long

@ -112,7 +112,13 @@
<li class="toctree-l2"><a class="reference internal" href="trace.html">trace</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">stack</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#">参数说明</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">使用例子</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">使用例子</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#demo">启动 Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#stack">stack</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">据条件表达式来过滤</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">据执行时间来过滤</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="tt.html">tt</a></li>
@ -240,86 +246,49 @@
</div>
<div class="section" id="">
<span id="id2"></span><h2>使用例子<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<blockquote>
<div>注意:如果表达式里面包含了引号,那么需要把整个表达式用引号括起来,如果表达式中没有包含引号,那么可以不用引号。当然,一个好的习惯是,不管表达式中有没有引号,都使用引号括起来。</div></blockquote>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ stack com.alibaba.sample.petstore.dal.dao.ProductDao getProductById &#39;params[0]==&quot;K9-BD-01&quot;&#39;
<div class="section" id="demo">
<span id="demo"></span><h3>启动 Demo<a class="headerlink" href="#demo" title="永久链接至标题"></a></h3>
<p>启动<a class="reference internal" href="quick-start.html"><span class="doc">快速入门</span></a>里的<code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code></p>
</div>
<div class="section" id="stack">
<span id="id3"></span><h3>stack<a class="headerlink" href="#stack" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 51 ms.
thread_name=&quot;http-bio-8080-exec-4&quot; thread_id=0x4a;is_daemon=true;priority=5;
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50)
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(&lt;generated&gt;:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
......
thread_name=&quot;http-bio-8080-exec-2&quot; thread_id=0x48;is_daemon=true;priority=5;
@com.alibaba.sample.petstore.dal.dao.ibatis.IbatisProductDao.getProductById()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute(ItemList.java:50)
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(&lt;generated&gt;:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
......
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">36</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:32:19<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
</pre></div>
</div>
<p>按照耗时查询:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost&gt;30
</div>
<div class="section" id="">
<span id="id4"></span><h3>据条件表达式来过滤<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack demo.MathGame primeFactors <span class="s1">&#39;params[0]&lt;0&#39;</span> -n <span class="m">2</span>
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 123 ms.
stack com.alibaba.sample.petstore.web.store.module.screen.ItemList execute #cost&gt;30
thread_name=http-nio-8080-exec-10;id=31;is_daemon=true;priority=5;TCCL=com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
@com.alibaba.sample.petstore.web.store.module.screen.ItemList.execute()
at com.alibaba.sample.petstore.web.store.module.screen.ItemList$$FastClassByCGLIB$$40b2f45f.invoke(&lt;generated&gt;:-1)
at net.sf.cglib.reflect.FastMethod.invoke(FastMethod.java:53)
at com.alibaba.citrus.service.moduleloader.impl.adapter.MethodInvoker.invoke(MethodInvoker.java:70)
at com.alibaba.citrus.service.moduleloader.impl.adapter.DataBindingAdapter.executeAndReturn(DataBindingAdapter.java:41)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.performScreenModule(PerformScreenValve.java:111)
at com.alibaba.citrus.turbine.pipeline.valve.PerformScreenValve.invoke(PerformScreenValve.java:74)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:73)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.ChooseValve.invoke(ChooseValve.java:98)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invokeBody(LoopValve.java:105)
at com.alibaba.citrus.service.pipeline.impl.valve.LoopValve.invoke(LoopValve.java:83)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PageAuthorizationValve.invoke(PageAuthorizationValve.java:105)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.CheckCsrfTokenValve.invoke(CheckCsrfTokenValve.java:123)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.AnalyzeURLValve.invoke(AnalyzeURLValve.java:126)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.SetLoggingContextValve.invoke(SetLoggingContextValve.java:66)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.turbine.pipeline.valve.PrepareForTurbineValve.invoke(PrepareForTurbineValve.java:52)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invokeNext(PipelineImpl.java:157)
at com.alibaba.citrus.service.pipeline.impl.PipelineImpl$PipelineContextImpl.invoke(PipelineImpl.java:210)
at com.alibaba.citrus.webx.impl.WebxControllerImpl.service(WebxControllerImpl.java:43)
at com.alibaba.citrus.webx.impl.WebxRootControllerImpl.handleRequest(WebxRootControllerImpl.java:53)
at com.alibaba.citrus.webx.support.AbstractWebxRootController.service(AbstractWebxRootController.java:165)
.........
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">30</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:34:27<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:34:30<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
Command execution <span class="nb">times</span> exceed limit: <span class="m">2</span>, so <span class="nb">command</span> will exit. You can <span class="nb">set</span> it with -n option.
</pre></div>
</div>
<blockquote>
<div>只会打印出耗时超过30ms的堆栈情况</div></blockquote>
</div>
<div class="section" id="">
<span id="id5"></span><h3>据执行时间来过滤<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ stack demo.MathGame primeFactors <span class="s1">&#39;#cost&gt;5&#39;</span>
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">35</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:35:58<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
@demo.MathGame.run<span class="o">()</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
</pre></div>
</div>
</div>
</div>
</div>

@ -112,7 +112,13 @@
<li class="toctree-l2 current"><a class="current reference internal" href="#">trace</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#">参数说明</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">注意事项</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">使用参考</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">使用参考</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#demo">启动 Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#trace">trace函数</a></li>
<li class="toctree-l4"><a class="reference internal" href="#jdk">过滤掉jdk的函数</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">据调用耗时过滤</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="stack.html">stack</a></li>
@ -242,14 +248,9 @@
<li>特殊用法请参考:<a class="reference external" href="https://github.com/alibaba/arthas/issues/71">https://github.com/alibaba/arthas/issues/71</a></li>
<li>OGNL表达式官网<a class="reference external" href="https://commons.apache.org/proper/commons-ognl/language-guide.html">https://commons.apache.org/proper/commons-ognl/language-guide.html</a></li>
</ul>
<p>很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果现在Arthas可以按照方法执行的耗时来进行过滤了例如<code class="docutils literal notranslate"><span class="pre">trace</span> <span class="pre">*StringUtils</span> <span class="pre">isBlank</span> <span class="pre">'$cost&gt;100'</span></code>表示当执行时间超过100ms的时候才会输出trace的结果。</p>
<p>很多时候我们只想看到某个方法的rt大于某个时间之后的trace结果现在Arthas可以按照方法执行的耗时来进行过滤了例如<code class="docutils literal notranslate"><span class="pre">trace</span> <span class="pre">*StringUtils</span> <span class="pre">isBlank</span> <span class="pre">'#cost&gt;100'</span></code>表示当执行时间超过100ms的时候才会输出trace的结果。</p>
<blockquote>
<div><p>注意:</p>
<ol class="simple">
<li>watch/stack/trace这个三个命令都支持$cost</li>
<li>如果是Arthas 3.0,请把<code class="docutils literal notranslate"><span class="pre">$cost</span></code>改为<code class="docutils literal notranslate"><span class="pre">#cost</span></code></li>
</ol>
</div></blockquote>
<div>watch/stack/trace这个三个命令都支持<code class="docutils literal notranslate"><span class="pre">#cost</span></code></div></blockquote>
</div>
<div class="section" id="">
<span id="id2"></span><h2>注意事项<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
@ -257,76 +258,60 @@
</div>
<div class="section" id="">
<span id="id3"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>代码示例:</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span> <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="n">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
<span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;a&quot;</span><span class="o">);</span>
<span class="n">list</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;b&quot;</span><span class="o">);</span>
<span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list2</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;();</span>
<span class="n">list2</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;c&quot;</span><span class="o">);</span>
<span class="n">list2</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="s">&quot;d&quot;</span><span class="o">);</span>
<span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="n">add</span><span class="o">(</span><span class="n">list</span><span class="o">,</span> <span class="n">list2</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kt">int</span> <span class="nf">add</span><span class="o">(</span><span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list</span><span class="o">,</span> <span class="n">List</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">list2</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>
<span class="k">while</span> <span class="o">(</span><span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">try</span> <span class="o">{</span>
<span class="n">hehe</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="n">Throwable</span> <span class="n">t</span><span class="o">)</span> <span class="o">{</span>
<span class="n">t</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>
<span class="o">}</span>
<span class="n">i</span><span class="o">--;</span>
<span class="o">}</span>
<span class="n">list</span><span class="o">.</span><span class="na">addAll</span><span class="o">(</span><span class="n">list2</span><span class="o">);</span>
<span class="k">return</span> <span class="n">list</span><span class="o">.</span><span class="na">size</span><span class="o">();</span>
<span class="o">}</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">hehe</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">)</span> <span class="o">{</span>
<span class="k">if</span> <span class="o">(</span><span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="k">throw</span> <span class="k">new</span> <span class="n">RuntimeException</span><span class="o">(</span><span class="s">&quot;ZERO&quot;</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<div class="section" id="demo">
<span id="demo"></span><h3>启动 Demo<a class="headerlink" href="#demo" title="永久链接至标题"></a></h3>
<p>启动<a class="reference internal" href="quick-start.html"><span class="doc">快速入门</span></a>里的<code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code></p>
</div>
<div class="section" id="trace">
<span id="id4"></span><h3>trace函数<a class="headerlink" href="#trace" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace demo.MathGame run
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">42</span> ms.
<span class="sb">`</span>---ts<span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">00</span>:44:17<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="sb">`</span>---<span class="o">[</span><span class="m">10</span>.611029ms<span class="o">]</span> demo.MathGame:run<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.05638ms<span class="o">]</span> java.util.Random:nextInt<span class="o">()</span>
+---<span class="o">[</span><span class="m">10</span>.036885ms<span class="o">]</span> demo.MathGame:primeFactors<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="m">0</span>.170316ms<span class="o">]</span> demo.MathGame:print<span class="o">()</span>
</pre></div>
</div>
<p>监测 <code class="docutils literal notranslate"><span class="pre">add</span></code> 方法:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList add params.length<span class="o">==</span><span class="m">2</span>
</div>
<div class="section" id="jdk">
<span id="jdk"></span><h3>过滤掉jdk的函数<a class="headerlink" href="#jdk" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace -j demo.MathGame run
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">144</span> ms.
<span class="sb">`</span>---Tracing...
<span class="sb">`</span>---<span class="o">[</span>2ms<span class="o">]</span>com.alibaba.sample.petstore.web.store.module.screen.ItemList:add<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>,0,0ms,11<span class="o">]</span>com.alibaba.sample.petstore.web.store.module.screen.ItemList:hehe<span class="o">()</span> <span class="o">[</span>throws Exception<span class="o">]</span>
+---<span class="o">[</span>1ms<span class="o">]</span>java.lang.Throwable:printStackTrace<span class="o">()</span>
+---<span class="o">[</span>0ms<span class="o">]</span>java.util.List:addAll<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span>0ms<span class="o">]</span>java.util.List:size<span class="o">()</span>
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">31</span> ms.
<span class="sb">`</span>---ts<span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:09:14<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="sb">`</span>---<span class="o">[</span><span class="m">5</span>.190646ms<span class="o">]</span> demo.MathGame:run<span class="o">()</span>
+---<span class="o">[</span><span class="m">4</span>.465779ms<span class="o">]</span> demo.MathGame:primeFactors<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="m">0</span>.375324ms<span class="o">]</span> demo.MathGame:print<span class="o">()</span>
</pre></div>
</div>
<p>按照耗时过滤:</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="c1">#cost&gt;4</span>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">-j</span></code>: jdkMethodSkip, skip jdk method trace</li>
</ul>
</div>
<div class="section" id="">
<span id="id5"></span><h3>据调用耗时过滤<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace demo.MathGame run <span class="s1">&#39;#cost &gt; 10&#39;</span>
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">159</span> ms.
trace com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="c1">#cost&gt;4</span>
<span class="sb">`</span>---thread_name<span class="o">=</span>http-nio-8080-exec-5<span class="p">;</span><span class="nv">id</span><span class="o">=</span>2c<span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>true<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>com.taobao.pandora.boot.embedded.tomcat.TomcatEmbeddedWebappClassLoader
<span class="sb">`</span>---<span class="o">[</span><span class="m">8</span>.866586ms<span class="o">]</span> com.alibaba.sample.petstore.web.store.module.screen.ItemList:execute<span class="o">()</span>
+---<span class="o">[</span><span class="m">2</span>.847106ms<span class="o">]</span> com.alibaba.sample.petstore.biz.StoreManager:getAllProductItems<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.765544ms<span class="o">]</span> com.alibaba.sample.petstore.dal.dao.ProductDao:getProductById<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.021204ms<span class="o">]</span> com.alibaba.sample.petstore.dal.dataobject.Product:getCategoryId<span class="o">()</span>
+---<span class="o">[</span><span class="m">1</span>.341532ms<span class="o">]</span> com.alibaba.sample.petstore.dal.dao.CategoryDao:getCategoryById<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="nv">min</span><span class="o">=</span><span class="m">0</span>.005428ms,max<span class="o">=</span><span class="m">0</span>.094064ms,total<span class="o">=</span><span class="m">0</span>.105228ms,count<span class="o">=</span><span class="m">3</span><span class="o">]</span> com.alibaba.citrus.turbine.Context:put<span class="o">()</span>
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">41</span> ms.
<span class="sb">`</span>---ts<span class="o">=</span><span class="m">2018</span>-12-04 <span class="m">01</span>:12:02<span class="p">;</span><span class="nv">thread_name</span><span class="o">=</span>main<span class="p">;</span><span class="nv">id</span><span class="o">=</span><span class="m">1</span><span class="p">;</span><span class="nv">is_daemon</span><span class="o">=</span>false<span class="p">;</span><span class="nv">priority</span><span class="o">=</span><span class="m">5</span><span class="p">;</span><span class="nv">TCCL</span><span class="o">=</span>sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="sb">`</span>---<span class="o">[</span><span class="m">12</span>.033735ms<span class="o">]</span> demo.MathGame:run<span class="o">()</span>
+---<span class="o">[</span><span class="m">0</span>.006783ms<span class="o">]</span> java.util.Random:nextInt<span class="o">()</span>
+---<span class="o">[</span><span class="m">11</span>.852594ms<span class="o">]</span> demo.MathGame:primeFactors<span class="o">()</span>
<span class="sb">`</span>---<span class="o">[</span><span class="m">0</span>.05447ms<span class="o">]</span> demo.MathGame:print<span class="o">()</span>
</pre></div>
</div>
<blockquote>
<div>只会展示耗时大于4ms的调用路径有助于在排查问题的时候只关注异常情况</div></blockquote>
<ul class="simple">
<li>是不是很眼熟,没错,在 JProfiler 等收费软件中你曾经见识类似的功能,这里你将可以通过命令就能打印出指定调用路径。 友情提醒下,<code class="docutils literal notranslate"><span class="pre">trace</span></code> 在执行的过程中本身是会有一定的性能开销,在统计的报告中并未像 JProfiler 一样预先减去其自身的统计开销。所以这统计出来有些许的不准,渲染路径上调用的类、方法越多,性能偏差越大。但还是能让你看清一些事情的。</li>
<li>[2ms] 的含义,<code class="docutils literal notranslate"><span class="pre">2</span></code> 的含义是:当前节点在当前步骤的耗时,单位为毫秒</li>
<li>[12.033735ms] 的含义,<code class="docutils literal notranslate"><span class="pre">12.033735</span></code> 的含义是:当前节点在当前步骤的耗时,单位为毫秒</li>
<li>[0,0,0ms,11]xxx:yyy() [throws Exception],对该方法中相同的方法调用进行了合并,<code class="docutils literal notranslate"><span class="pre">0,0,0ms,11</span></code> 表示方法调用耗时,<code class="docutils literal notranslate"><span class="pre">min,max,total,count</span></code><code class="docutils literal notranslate"><span class="pre">throws</span> <span class="pre">Exception</span></code> 表明该方法调用中存在异常返回</li>
<li>这里存在一个统计不准确的问题,就是所有方法耗时加起来可能会小于该监测方法的总耗时,这个是由于 Arthas 本身的逻辑会有一定的耗时</li>
</ul>
</div>
</div>
</div>

@ -112,10 +112,14 @@
<li class="toctree-l2"><a class="reference internal" href="trace.html">trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="stack.html">stack</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">tt</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#">记录方法的调用</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">检索调用记录</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">查看调用信息</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">重做一次调用</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">使用参考</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#demo">启动 Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">记录调用</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">检索调用记录</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">查看调用信息</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">重做一次调用</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="options.html">options</a></li>
@ -204,26 +208,27 @@
<p>这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。</p>
<p>于是乎TimeTunnel 命令就诞生了。</p>
<div class="section" id="">
<span id="id1"></span><h2>记录方法的调用<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<ul>
<li><p class="first">基本用法</p>
<span id="id1"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="section" id="demo">
<span id="demo"></span><h3>启动 Demo<a class="headerlink" href="#demo" title="永久链接至标题"></a></h3>
<p>启动<a class="reference internal" href="quick-start.html"><span class="doc">快速入门</span></a>里的<code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code></p>
</div>
<div class="section" id="">
<span id="id2"></span><h3>记录调用<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>对于一个最基本的使用来说,就是记录下当前方法的每次调用环境现场。</p>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">$</span> <span class="n">tt</span> <span class="o">-</span><span class="n">t</span> <span class="o">-</span><span class="n">n</span> <span class="mi">3</span> <span class="o">*</span><span class="n">Test</span> <span class="n">print</span>
<span class="n">Press</span> <span class="n">Ctrl</span><span class="o">+</span><span class="n">D</span> <span class="n">or</span> <span class="n">Ctrl</span><span class="o">+</span><span class="n">X</span> <span class="n">to</span> <span class="n">abort</span><span class="o">.</span>
<span class="nf">Affect</span><span class="o">(</span><span class="n">class</span><span class="o">-</span><span class="n">cnt</span><span class="o">:</span><span class="mi">1</span> <span class="o">,</span> <span class="n">method</span><span class="o">-</span><span class="n">cnt</span><span class="o">:</span><span class="mi">1</span><span class="o">)</span> <span class="n">cost</span> <span class="n">in</span> <span class="mi">115</span> <span class="n">ms</span><span class="o">.</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="n">INDEX</span> <span class="o">|</span> <span class="n">TIMESTAMP</span> <span class="o">|</span> <span class="n">COST</span><span class="o">(</span><span class="n">ms</span><span class="o">)</span> <span class="o">|</span> <span class="n">IS</span><span class="o">-</span><span class="n">RET</span> <span class="o">|</span> <span class="n">IS</span><span class="o">-</span><span class="n">EXP</span> <span class="o">|</span> <span class="n">OBJECT</span> <span class="o">|</span> <span class="n">CLASS</span> <span class="o">|</span> <span class="n">METHOD</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="mi">1007</span> <span class="o">|</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">07</span><span class="o">-</span><span class="mi">26</span> <span class="mi">12</span><span class="o">:</span><span class="mi">23</span><span class="o">:</span><span class="mi">21</span> <span class="o">|</span> <span class="mi">138</span> <span class="o">|</span> <span class="kc">true</span> <span class="o">|</span> <span class="kc">false</span> <span class="o">|</span> <span class="mh">0x42cc13a0</span> <span class="o">|</span> <span class="n">GaOgnlUtilsTest</span> <span class="o">|</span> <span class="n">print</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="mi">1008</span> <span class="o">|</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">07</span><span class="o">-</span><span class="mi">26</span> <span class="mi">12</span><span class="o">:</span><span class="mi">23</span><span class="o">:</span><span class="mi">22</span> <span class="o">|</span> <span class="mi">143</span> <span class="o">|</span> <span class="kc">true</span> <span class="o">|</span> <span class="kc">false</span> <span class="o">|</span> <span class="mh">0x42cc13a0</span> <span class="o">|</span> <span class="n">GaOgnlUtilsTest</span> <span class="o">|</span> <span class="n">print</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="o">|</span> <span class="mi">1009</span> <span class="o">|</span> <span class="mi">2015</span><span class="o">-</span><span class="mo">07</span><span class="o">-</span><span class="mi">26</span> <span class="mi">12</span><span class="o">:</span><span class="mi">23</span><span class="o">:</span><span class="mi">23</span> <span class="o">|</span> <span class="mi">130</span> <span class="o">|</span> <span class="kc">true</span> <span class="o">|</span> <span class="kc">false</span> <span class="o">|</span> <span class="mh">0x42cc13a0</span> <span class="o">|</span> <span class="n">GaOgnlUtilsTest</span> <span class="o">|</span> <span class="n">print</span> <span class="o">|</span>
<span class="o">+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+</span>
<span class="n">$</span>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -t demo.MathGame primeFactors
Press Ctrl+C to abort.
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">66</span> ms.
INDEX TIMESTAMP COST<span class="o">(</span>ms<span class="o">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="m">1000</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:38 <span class="m">1</span>.096236 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1001</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:39 <span class="m">0</span>.191848 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1002</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:40 <span class="m">0</span>.069523 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1003</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41 <span class="m">0</span>.186073 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1004</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:42 <span class="m">17</span>.76437 <span class="nb">true</span> <span class="nb">false</span> 0x4b67cf4d MathGame primeFactors
</pre></div>
</div>
</li>
<ul>
<li><p class="first">命令参数解析</p>
<ul>
<li><p class="first"><code class="docutils literal notranslate"><span class="pre">-t</span></code></p>
@ -302,120 +307,81 @@
</ul>
</div>
<div class="section" id="">
<span id="id2"></span><h2>检索调用记录<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<span id="id3"></span><h3>检索调用记录<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>当你用 <code class="docutils literal notranslate"><span class="pre">tt</span></code> 记录了一大片的时间片段之后,你希望能从中筛选出自己需要的时间片段,这个时候你就需要对现有记录进行检索。</p>
<p>假设我们有这些记录</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -l
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1000 | 2015-07-26 01:16:27 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1002 | 2015-07-26 01:16:28 | 119 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1004 | 2015-07-26 12:21:56 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1005 | 2015-07-26 12:21:57 | 138 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1006 | 2015-07-26 12:21:58 | 130 | true | false | 0x42cc13a0 | GaOgnlUtilsTest | print |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:7) cost in 2 ms.
$
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -l
INDEX TIMESTAMP COST<span class="o">(</span>ms<span class="o">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="m">1000</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:38 <span class="m">1</span>.096236 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1001</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:39 <span class="m">0</span>.191848 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1002</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:40 <span class="m">0</span>.069523 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1003</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41 <span class="m">0</span>.186073 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1004</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:42 <span class="m">17</span>.76437 <span class="nb">true</span> <span class="nb">false</span> 0x4b67cf4d MathGame primeFactors
<span class="m">9</span>
<span class="m">1005</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:43 <span class="m">0</span>.4776 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
Affect<span class="o">(</span>row-cnt:6<span class="o">)</span> cost in <span class="m">4</span> ms.
</pre></div>
</div>
<p>我需要筛选出 <code class="docutils literal notranslate"><span class="pre">printAddress</span></code> 方法的调用信息</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -s method.name==&quot;printAddress&quot;
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| INDEX | TIMESTAMP | COST(ms) | IS-RET | IS-EXP | OBJECT | CLASS | METHOD |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1001 | 2015-07-26 01:16:27 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
| 1003 | 2015-07-26 01:16:28 | 0 | false | true | 0x42cc13a0 | GaOgnlUtilsTest | printAddress |
+----------+----------------------+------------+----------+----------+-----------------+--------------------------------+--------------------------------+
Affect(row-cnt:2) cost in 55 ms.
$
<p>我需要筛选出 <code class="docutils literal notranslate"><span class="pre">primeFactors</span></code> 方法的调用信息</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -s <span class="s1">&#39;method.name==&quot;primeFactors&quot;&#39;</span>
INDEX TIMESTAMP COST<span class="o">(</span>ms<span class="o">)</span> IS-RET IS-EXP OBJECT CLASS METHOD
-------------------------------------------------------------------------------------------------------------------------------------
<span class="m">1000</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:38 <span class="m">1</span>.096236 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1001</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:39 <span class="m">0</span>.191848 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1002</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:40 <span class="m">0</span>.069523 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1003</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41 <span class="m">0</span>.186073 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
<span class="m">1004</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:42 <span class="m">17</span>.76437 <span class="nb">true</span> <span class="nb">false</span> 0x4b67cf4d MathGame primeFactors
<span class="m">9</span>
<span class="m">1005</span> <span class="m">2018</span>-12-04 <span class="m">11</span>:15:43 <span class="m">0</span>.4776 <span class="nb">false</span> <span class="nb">true</span> 0x4b67cf4d MathGame primeFactors
Affect<span class="o">(</span>row-cnt:6<span class="o">)</span> cost in <span class="m">607</span> ms.
</pre></div>
</div>
<p>你需要一个 <code class="docutils literal notranslate"><span class="pre">-s</span></code> 参数。<span style="color:red;">同样的,搜索表达式的核心对象依旧是 <code class="docutils literal notranslate"><span class="pre">Advice</span></code> 对象。</span></p>
</div>
<div class="section" id="">
<span id="id3"></span><h2>查看调用信息<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<span id="id4"></span><h3>查看调用信息<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>对于具体一个时间片的信息而言,你可以通过 <code class="docutils literal notranslate"><span class="pre">-i</span></code> 参数后边跟着对应的 <code class="docutils literal notranslate"><span class="pre">INDEX</span></code> 编号查看到他的详细信息。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$
$ tt -i 1003
+-----------------+------------------------------------------------------------------------------------------------------+
| INDEX | 1003 |
+-----------------+------------------------------------------------------------------------------------------------------+
| GMT-CREATE | 2015-07-26 01:16:28 |
+-----------------+------------------------------------------------------------------------------------------------------+
| COST(ms) | 0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(Unknown Source) |
| | at GaOgnlUtilsTest.&lt;init&gt;(Unknown Source) |
| | at GaOgnlUtilsTest.main(Unknown Source) |
+-----------------+------------------------------------------------------------------------------------------------------+
Affect(row-cnt:1) cost in 1 ms.
$
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -i <span class="m">1003</span>
INDEX <span class="m">1003</span>
GMT-CREATE <span class="m">2018</span>-12-04 <span class="m">11</span>:15:41
COST<span class="o">(</span>ms<span class="o">)</span> <span class="m">0</span>.186073
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
IS-RETURN <span class="nb">false</span>
IS-EXCEPTION <span class="nb">true</span>
PARAMETERS<span class="o">[</span><span class="m">0</span><span class="o">]</span> @Integer<span class="o">[</span>-564322413<span class="o">]</span>
THROW-EXCEPTION java.lang.IllegalArgumentException: number is: -564322413, need &gt;<span class="o">=</span> <span class="m">2</span>
at demo.MathGame.primeFactors<span class="o">(</span>MathGame.java:46<span class="o">)</span>
at demo.MathGame.run<span class="o">(</span>MathGame.java:24<span class="o">)</span>
at demo.MathGame.main<span class="o">(</span>MathGame.java:16<span class="o">)</span>
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">11</span> ms.
</pre></div>
</div>
</div>
<div class="section" id="">
<span id="id4"></span><h2>重做一次调用<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<span id="id5"></span><h3>重做一次调用<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>当你稍稍做了一些调整之后,你可能需要前端系统重新触发一次你的调用,此时得求爷爷告奶奶的需要前端配合联调的同学再次发起一次调用。而有些场景下,这个调用不是这么好触发的。</p>
<p><code class="docutils literal notranslate"><span class="pre">tt</span></code> 命令由于保存了当时调用的所有现场信息,所以我们可以自己主动对一个 <code class="docutils literal notranslate"><span class="pre">INDEX</span></code> 编号的时间片自主发起一次调用,从而解放你的沟通成本。此时你需要 <code class="docutils literal notranslate"><span class="pre">-p</span></code> 参数。</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ tt -i 1003 -p
+-----------------+---------------------------------------------------------------------------------------------------------+
| RE-INDEX | 1003 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| GMT-REPLAY | 2015-07-26 17:29:51 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| OBJECT | 0x42cc13a0 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| CLASS | GaOgnlUtilsTest |
+-----------------+---------------------------------------------------------------------------------------------------------+
| METHOD | printAddress |
+-----------------+---------------------------------------------------------------------------------------------------------+
| PARAMETERS[0] | Address@53448f87 |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-RETURN | false |
+-----------------+---------------------------------------------------------------------------------------------------------+
| IS-EXCEPTION | true |
+-----------------+---------------------------------------------------------------------------------------------------------+
| THROW-EXCEPTION | java.lang.RuntimeException: test |
| | at GaOgnlUtilsTest.printAddress(GaOgnlUtilsTest.java:78) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) |
| | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) |
| | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) |
| | at java.lang.reflect.Method.invoke(Method.java:483) |
| | at com.github.ompc.Arthas.util.GaMethod.invoke(GaMethod.java:81) |
| | at com.github.ompc.Arthas.command.TimeTunnelCommand$6.action(TimeTunnelCommand.java:592) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.execute(DefaultCommandHandler.java:175) |
| | at com.github.ompc.Arthas.server.DefaultCommandHandler.executeCommand(DefaultCommandHandler.java:83) |
| | at com.github.ompc.Arthas.server.GaServer$4.run(GaServer.java:329) |
| | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) |
| | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) |
| | at java.lang.Thread.run(Thread.java:745) |
+-----------------+---------------------------------------------------------------------------------------------------------+
replay time fragment[1003] success.
Affect(row-cnt:1) cost in 3 ms.
$
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ tt -i <span class="m">1004</span> -p
RE-INDEX <span class="m">1004</span>
GMT-REPLAY <span class="m">2018</span>-12-04 <span class="m">11</span>:26:00
OBJECT 0x4b67cf4d
CLASS demo.MathGame
METHOD primeFactors
PARAMETERS<span class="o">[</span><span class="m">0</span><span class="o">]</span> @Integer<span class="o">[</span><span class="m">946738738</span><span class="o">]</span>
IS-RETURN <span class="nb">true</span>
IS-EXCEPTION <span class="nb">false</span>
RETURN-OBJ @ArrayList<span class="o">[</span>
@Integer<span class="o">[</span><span class="m">2</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">11</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">17</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">2531387</span><span class="o">]</span>,
<span class="o">]</span>
Time fragment<span class="o">[</span><span class="m">1004</span><span class="o">]</span> successfully replayed.
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">14</span> ms.
</pre></div>
</div>
<p>你会发现结果虽然一样,但调用的路径发生了变化,有原来的程序发起变成了 Arthas 自己的内部线程发起的调用了。</p>
@ -433,6 +399,7 @@ $
</li>
</ul>
</div>
</div>
</div>

@ -111,6 +111,7 @@
<li class="toctree-l2 current"><a class="current reference internal" href="#">watch</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#">参数说明</a></li>
<li class="toctree-l3"><a class="reference internal" href="#">使用参考</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#demo">启动 Demo</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">观察方法出参和返回值</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">观察方法入参</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">同时观察方法调用前和方法返回后</a></li>
@ -277,7 +278,10 @@
</div>
<div class="section" id="">
<span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="section" id="demo">
<span id="demo"></span><h3>启动 Demo<a class="headerlink" href="#demo" title="永久链接至标题"></a></h3>
<p>启动<a class="reference internal" href="quick-start.html"><span class="doc">快速入门</span></a>里的<code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code></p>
</div>
<div class="section" id="">
<span id="id3"></span><h3>观察方法出参和返回值<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span>
@ -460,11 +464,11 @@ Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span>
</pre></div>
</div>
<p>然后使用<code class="docutils literal notranslate"><span class="pre">target.field_name</span></code>访问当前对象的某个属性</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors &#39;target.illegalArgumentCount&#39;
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s1">&#39;target.illegalArgumentCount&#39;</span>
Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">67</span> ms.
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">20</span>:04:34<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">131</span>.303498ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">8</span><span class="o">]</span>
<span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">20</span>:04:35<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.961441ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">8</span><span class="o">]</span>
</pre></div>
</div>
</div>

Loading…
Cancel
Save