update doc

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

@ -17,116 +17,95 @@ classloader
|[a]|列出所有ClassLoader加载的类请谨慎使用| |[a]|列出所有ClassLoader加载的类请谨慎使用|
|`[c:]`|ClassLoader的hashcode| |`[c:]`|ClassLoader的hashcode|
|`[c: r:]`|用ClassLoader去查找resource| |`[c: r:]`|用ClassLoader去查找resource|
|`[c: load:]`|用ClassLoader去加载指定的类|
### 使用参考 ### 使用参考
* 按类加载类型查看统计信息 #### 按类加载类型查看统计信息
```s ```bash
$ classloader $ classloader
name numberOfInstances loadedCountTotal name numberOfInstances loadedCountTotal
com.taobao.pandora.service.loader.ModuleClassLoader 29 11659 com.taobao.arthas.agent.ArthasClassloader 1 2115
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader 1 5308 BootstrapClassLoader 1 1861
BootstrapClassLoader 1 3711 sun.reflect.DelegatingClassLoader 5 5
com.taobao.arthas.agent.ArthasClassloader 2 2825 sun.misc.Launcher$AppClassLoader 1 4
sun.reflect.DelegatingClassLoader 332 332 sun.misc.Launcher$ExtClassLoader 1 1
java.net.URLClassLoader 1 285 Affect(row-cnt:5) cost in 3 ms.
sun.misc.Launcher$AppClassLoader 1 77
sun.misc.Launcher$ExtClassLoader 1 46
com.alibaba.fastjson.util.ASMClassLoader 2 3
org.jvnet.hk2.internal.DelegatingClassLoader 2 2
sun.reflect.misc.MethodUtil 1 1
Affect(row-cnt:11) cost in 66 ms.
``` ```
* 按类加载实例查看统计信息 #### 按类加载实例查看统计信息
```bash ```bash
$ classloader -l $ classloader -l
name loadedCount hash parent name loadedCount hash parent
BootstrapClassLoader 3711 null null BootstrapClassLoader 1861 null null
com.alibaba.fastjson.util.ASMClassLoader@3bbaa1b8 2 3bbaa1b8 monitor's ModuleClassLoader com.taobao.arthas.agent.ArthasClassloader@68b31f0a 2115 68b31f0a sun.misc.Launcher$ExtClassLoader@66350f69
com.alibaba.fastjson.util.ASMClassLoader@5e255d0b 1 5e255d0b eagleeye-core's ModuleClassLoader sun.misc.Launcher$AppClassLoader@3d4eac69 4 3d4eac69 sun.misc.Launcher$ExtClassLoader@66350f69
com.taobao.arthas.agent.ArthasClassloader@4fa2d7e6 1795 4fa2d7e6 sun.misc.Launcher$ExtClassLoader@a38d7a3 sun.misc.Launcher$ExtClassLoader@66350f69 1 66350f69 null
com.taobao.arthas.agent.ArthasClassloader@522400c2 1033 522400c2 sun.misc.Launcher$ExtClassLoader@a38d7a3 Affect(row-cnt:4) cost in 2 ms.
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444 5308 1817d444 sun.misc.Launcher$AppClassLoader@14dad5dc
tbsession's ModuleClassLoader 285 609cd4d8 null
pandora-qos-service's ModuleClassLoader 267 2f8dad04 null
pandora-framework's ModuleClassLoader 78 4009e306 null
filesync-client's ModuleClassLoader 4 4b8ee4de null
rocketmq-client's ModuleClassLoader 431 247bddad null
eagleeye-core's ModuleClassLoader 451 1ba9117e null
alimonitor-jmonitor's ModuleClassLoader 134 22fcf7ab null
metaq-client's ModuleClassLoader 35 41a2befb null
hsf-mock's ModuleClassLoader 3 2002fc1d null
monitor's ModuleClassLoader 1427 131ef10 null
spas-sdk-service's ModuleClassLoader 7 10d307f1 null
vipserver-client's ModuleClassLoader 137 7a419da4 null
metrics's ModuleClassLoader 146 696da30b null
mtop-uncenter's ModuleClassLoader 922 79d8407f null
spas-sdk-client's ModuleClassLoader 235 4944252c null
live-profiler-pandora's ModuleClassLoader 1 6913c1fb null
notify-tr-client's ModuleClassLoader 472 fba92d3 null
ons-sdk's ModuleClassLoader 70 23348b5d null
tair-plugin's ModuleClassLoader 1053 7c9d8e2 null
tddl-client's ModuleClassLoader 2354 4988d8b8 null
config-client's ModuleClassLoader 93 429bffaa null
diamond-client's ModuleClassLoader 360 3d5c822d null
pandolet's ModuleClassLoader 99 41e1e210 null
hsf's ModuleClassLoader 1796 3232a28a null
acl.plugin's ModuleClassLoader 379 67080771 null
buc.sso.client.plugin's ModuleClassLoader 195 13b6aecc null
unitrouter's ModuleClassLoader 64 7e5afaa6 null
switch's ModuleClassLoader 104 24313fcc null
hsf-notify-client's ModuleClassLoader 57 4d0f2471 null
java.net.URLClassLoader@7ec7ffd3 285 7ec7ffd3 sun.misc.Launcher$ExtClassLoader@a38d7a3
javax.management.remote.rmi.NoCallStackClassLoader@53f65459 1 53f65459 null
javax.management.remote.rmi.NoCallStackClassLoader@2833cc44 1 2833cc44 null
org.jvnet.hk2.internal.DelegatingClassLoader@72cda8ee 1 72cda8ee monitor's ModuleClassLoader
org.jvnet.hk2.internal.DelegatingClassLoader@1f57f96d 1 1f57f96d monitor's ModuleClassLoader
sun.misc.Launcher$AppClassLoader@14dad5dc 77 14dad5dc sun.misc.Launcher$ExtClassLoader@a38d7a3
sun.misc.Launcher$ExtClassLoader@a38d7a3 46 a38d7a3 null
sun.reflect.misc.MethodUtil@1201f221 1 1201f221 sun.misc.Launcher$AppClassLoader@14dad5dc
``` ```
* 查看ClassLoader的继承树 #### 查看ClassLoader的继承树
```shell ```bash
$ classloader -t $ classloader -t
+-BootstrapClassLoader +-BootstrapClassLoader
+-unitrouter's ModuleClassLoader +-sun.misc.Launcher$ExtClassLoader@66350f69
+-diamond-client's ModuleClassLoader +-com.taobao.arthas.agent.ArthasClassloader@68b31f0a
+-sun.misc.Launcher$ExtClassLoader@548a102f +-sun.misc.Launcher$AppClassLoader@3d4eac69
| +-sun.misc.Launcher$AppClassLoader@14dad5dc Affect(row-cnt:4) cost in 3 ms.
| +-com.taobao.arthas.agent.AgentLauncher$1@334e6bb8
| | +-sun.reflect.DelegatingClassLoader@328b3a05
| | +-sun.reflect.DelegatingClassLoader@73f44f24
``` ```
* 查看URLClassLoader实际的urls #### 查看URLClassLoader实际的urls
```shell ```bash
$ classloader -c 5ffe9775 $ classloader -c 3d4eac69
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/commons-lang-2.6.jar file:/private/tmp/arthas-demo.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/log4j-1.2.16.jar file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/logger.api-0.1.4.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.api-2.0.7-SNAPSHOT.jar Affect(row-cnt:9) cost in 3 ms.
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.container-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.thirdcontainer-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/picocontainer-2.14.3.jar
``` ```
* 使用ClassLoader去查找resource #### 使用ClassLoader去查找resource
```shell ```bash
$ classloader -c 226b143b -r META-INF/MANIFEST.MF $ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/private/tmp/arthas-demo.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF
``` ```
也可以尝试查找类的class文件 也可以尝试查找类的class文件
```shell ```bash
$ classloader -c 1b6d3586 -r java/lang/String.class $ classloader -c 1b6d3586 -r java/lang/String.class
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class
``` ```
#### 使用ClassLoader去加载类
```bash
$ classloader -c 3d4eac69 --load demo.MathGame
load class success.
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
```

@ -13,28 +13,17 @@ dump
### 使用参考 ### 使用参考
```shell ```bash
$ dump -E org\.apache\.commons\.lang\.StringUtils $ dump java.lang.String
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
29505d69 +-tddl-client's ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora null /Users/admin/logs/arthas/classdump/java/lang/String.class
.service.loader.ModuleClassLoader-29505d69/org.apache.commons.lang.StringUtils.class Affect(row-cnt:1) cost in 119 ms.
6e51ad67 +-java.net.URLClassLoader@6e51ad67 /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL ```
+-sun.misc.Launcher$AppClassLoader@6951a712 oader-6e51ad67/org.apache.commons.lang.StringUtils.class
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2 ```bash
2bdd9114 +-pandora-qos-service's ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora $ dump demo.*
.service.loader.ModuleClassLoader-2bdd9114/org.apache.commons.lang.StringUtils.class
544dc9ba +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.tomcat.
+-org.apache.catalina.loader.StandardClassLoader@2302e984 container.context.loader.AliWebappClassLoader-544dc9ba/org.apache.commons.lang.String
+-sun.misc.Launcher$AppClassLoader@6951a712 Utils.class
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL
+-sun.misc.Launcher$AppClassLoader@6951a712 oader-22880c2b/org.apache.commons.lang.StringUtils.class
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2
Affect(row-cnt:5) cost in 156 ms.
$ dump -E org\.apache\.commons\.lang\.StringUtils -c 22880c2b
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassLoader-22880c2b/org 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class
+-sun.misc.Launcher$AppClassLoader@6951a712 .apache.commons.lang.StringUtils.class +-sun.misc.Launcher$ExtClassLoader@66350f69
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2 Affect(row-cnt:1) cost in 39 ms.
Affect(row-cnt:1) cost in 67 ms.
``` ```

@ -1,11 +1,39 @@
getstatic getstatic
=== ===
* 推荐直接使用[ognl](ognl.md)命令,更加灵活。
通过getstatic命令可以方便的查看类的静态属性。使用方法为`getstatic class_name field_name` 通过getstatic命令可以方便的查看类的静态属性。使用方法为`getstatic class_name field_name`
```bash
$ getstatic demo.MathGame random
field: random
@Random[
serialVersionUID=@Long[3905348978240129619],
seed=@AtomicLong[120955813885284],
multiplier=@Long[25214903917],
addend=@Long[11],
mask=@Long[281474976710655],
DOUBLE_UNIT=@Double[1.1102230246251565E-16],
BadBound=@String[bound must be positive],
BadRange=@String[bound must be greater than origin],
BadSize=@String[size must be non-negative],
seedUniquifier=@AtomicLong[-3282039941672302964],
nextNextGaussian=@Double[0.0],
haveNextNextGaussian=@Boolean[false],
serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027],
seedOffset=@Long[24],
]
```
如果该静态属性是一个复杂对象还可以支持在该属性上通过ognl表示进行遍历过滤访问对象的内部属性等操作。 如果该静态属性是一个复杂对象还可以支持在该属性上通过ognl表示进行遍历过滤访问对象的内部属性等操作。
* OGNL特殊用法请参考[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)
例如假设n是一个MapMap的Key是一个Enum我们想过滤出Map中Key为某个Enum的值可以写如下命令 例如假设n是一个MapMap的Key是一个Enum我们想过滤出Map中Key为某个Enum的值可以写如下命令
``` ```

@ -3,29 +3,31 @@ Arthas Install
## 快速安装 ## 快速安装
### 使用`arthas-boot` ### 使用`arthas-boot`(推荐)
下载`arthas-boot.jar`,然后用`java -jar`的方式启动: 下载`arthas-boot.jar`,然后用`java -jar`的方式启动:
```bash ```bash
wget https://alibaba.github.io/arthas/arthas-boot.jar $ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
``` ```
打印帮助信息: 打印帮助信息:
```bash ```bash
java -jar arthas-boot.jar -h $ java -jar arthas-boot.jar -h
``` ```
* 如果下载速度比较慢可以使用aliyun的镜像`java -jar arthas-boot.jar --repo-mirror aliyun --use-http` * 如果下载速度比较慢可以使用aliyun的镜像
`java -jar arthas-boot.jar --repo-mirror aliyun --use-http`
### 使用`as.sh` ### 使用`as.sh`
Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 `回车` 执行即可: Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 `回车` 执行即可:
```bash ```bash
curl -L https://alibaba.github.io/arthas/install.sh | sh $ curl -L https://alibaba.github.io/arthas/install.sh | sh
``` ```
上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。 上述命令会下载启动脚本文件 `as.sh` 到当前目录,你可以放在任何地方或将其加入到 `$PATH` 中。
@ -41,13 +43,13 @@ curl -L https://alibaba.github.io/arthas/install.sh | sh
解压后,在文件夹里有`arthas-boot.jar`,直接用`java -jar`的方式启动: 解压后,在文件夹里有`arthas-boot.jar`,直接用`java -jar`的方式启动:
```bash ```bash
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
``` ```
打印帮助信息: 打印帮助信息:
```bash ```bash
java -jar arthas-boot.jar -h $ java -jar arthas-boot.jar -h
``` ```
@ -66,7 +68,7 @@ java -jar arthas-boot.jar -h
删除下面文件: 删除下面文件:
```bash ```bash
rm -rf ~/.arthas/ $ rm -rf ~/.arthas/
``` ```
* Windows平台直接删除user home下面的`.arthas`目录 * Windows平台直接删除user home下面的`.arthas`目录

@ -18,6 +18,65 @@ jad
### 使用参考 ### 使用参考
#### 编绎`java.lang.String`
```java
$ jad java.lang.String
ClassLoader:
Location:
/*
* Decompiled with CFR 0_132.
*/
package java.lang;
import java.io.ObjectStreamField;
...
public final class String
implements Serializable,
Comparable<String>,
CharSequence {
private final char[] value;
private int hash;
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
public String(byte[] arrby, int n, int n2) {
String.checkBounds(arrby, n, n2);
this.value = StringCoding.decode(arrby, n, n2);
}
...
```
#### 反编绎指定的函数
```java
$ jad demo.MathGame main
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
Location:
/private/tmp/arthas-demo.jar
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
do {
game.run();
TimeUnit.SECONDS.sleep(1L);
} while (true);
}
Affect(row-cnt:1) cost in 228 ms.
```
#### 反编绎时指定ClassLoader
> 当有多个 `ClassLoader` 都加载了这个类时,`jad` 命令会输出对应 `ClassLoader` 实例的 `hashcode`,然后你只需要重新执行 `jad` 命令,并使用参数 `-c <hashcode>` 就可以反编译指定 ClassLoader 加载的那个类了; > 当有多个 `ClassLoader` 都加载了这个类时,`jad` 命令会输出对应 `ClassLoader` 实例的 `hashcode`,然后你只需要重新执行 `jad` 命令,并使用参数 `-c <hashcode>` 就可以反编译指定 ClassLoader 加载的那个类了;
```java ```java
@ -39,7 +98,7 @@ ClassLoader:
+-monitor's ModuleClassLoader +-monitor's ModuleClassLoader
Location: Location:
/Users/zhuyong/Downloads/taobao-hsf.sar/plugins/monitor/lib/log4j-1.2.14.jar /Users/admin/app/log4j-1.2.14.jar
package org.apache.log4j; package org.apache.log4j;
@ -54,102 +113,8 @@ public class Logger extends Category
super(name); super(name);
} }
public static Logger getLogger(String name) ...
{
return LogManager.getLogger(name);
}
public static Logger getLogger(Class clazz)
{
return LogManager.getLogger(clazz.getName());
}
public static Logger getRootLogger()
{
return LogManager.getRootLogger();
}
public static Logger getLogger(String name, LoggerFactory factory)
{
return LogManager.getLogger(name, factory);
}
public void trace(Object message)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, null);
}
}
public void trace(Object message, Throwable t)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, t);
}
}
public boolean isTraceEnabled()
{
if (repository.isDisabled(5000))
{
return false;
}
return Level.TRACE.isGreaterOrEqual(getEffectiveLevel());
}
static
{
Logger.FQCN = Logger.class.getName();
}
}
Affect(row-cnt:1) cost in 190 ms. Affect(row-cnt:1) cost in 190 ms.
``` ```
反编译指定的方法:
```bash
$ jad com.taobao.container.web.arthas.rest.MetricsController directMetrics
ClassLoader:
+-com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444
+-sun.misc.Launcher$AppClassLoader@14dad5dc
+-sun.misc.Launcher$ExtClassLoader@a38d7a3
Location:
/Users/zhuyong/middleware/tomcat-web/tomcat-web-web/target/classes/
private Map<String, Object> directMetrics(String ip, String[] metrics) {
JSONObject obj;
HashMap<String, Object> result = new HashMap<String, Object>();
result.put("success", false);
String metricUrl = "http://" + ip + ":8006/metrics/specific";
String postBody = Arrays.stream(metrics).map(metric -> "metric=" + metric).collect(Collectors.joining("&"));
HttpClientUtils.Response resp = HttpClientUtils.sendPostRequest((String)metricUrl, (String)postBody);
if (resp.isSuccess() && (obj = JSON.parseObject(resp.getContent())).containsKey("success") && obj.getBoolean("success").booleanValue() && obj.containsKey("data")) {
JSONArray dataArray = obj.getJSONArray("data");
HashMap<String, Object> metricMap = new HashMap<String, Object>();
for (Object aDataArray : dataArray) {
JSONObject o = (JSONObject)aDataArray;
metricMap.put(o.getString("metric"), o.get("value"));
}
result.put("data", metricMap);
result.put("success", true);
return result;
}
return result;
}
Affect(row-cnt:1) cost in 1508 ms.
```

@ -37,19 +37,31 @@ monitor
### 使用参考 ### 使用参考
```shell ```bash
$ monitor -c 5 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute $ monitor -c 5 demo.MathGame primeFactors
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms. Affect(class-cnt:1 , method-cnt:1) cost in 94 ms.
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
2015-12-17 10:56:40 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute 10 10 0 2.00 0.00% 2018-12-03 19:06:38 demo.MathGame primeFactors 5 1 4 1.15 80.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
2015-12-17 10:56:45 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute 11 11 0 2.18 0.00% 2018-12-03 19:06:43 demo.MathGame primeFactors 5 3 2 42.29 40.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
2015-12-17 10:56:50 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute 0 0 0 0.00 0.00% 2018-12-03 19:06:48 demo.MathGame primeFactors 5 3 2 67.92 40.00%
timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
2018-12-03 19:06:53 demo.MathGame primeFactors 5 2 3 0.25 60.00%
timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
2018-12-03 19:06:58 demo.MathGame primeFactors 1 1 0 0.45 0.00%
timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
2018-12-03 19:07:03 demo.MathGame primeFactors 2 2 0 3182.72 0.00%
``` ```

@ -18,8 +18,8 @@ java -jar arthas-demo.jar
在命令行下面执行: 在命令行下面执行:
```bash ```bash
wget https://alibaba.github.io/arthas/arthas-boot.jar $ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
``` ```
* 执行该程序的用户需要和目标进程具有相同的权限。比如以`admin`用户来执行:`sudo su admin && java -jar arthas-boot.jar` 或 `sudo -u admin -EH java -jar arthas-boot.jar`。 * 执行该程序的用户需要和目标进程具有相同的权限。比如以`admin`用户来执行:`sudo su admin && java -jar arthas-boot.jar` 或 `sudo -u admin -EH java -jar arthas-boot.jar`。
@ -95,11 +95,11 @@ java.home /Library/Java/JavaVir
e/jre e/jre
``` ```
## 4. 通过sysenv命令来获取到进程的Main Class ## 4. 通过thread命令来获取到进程的Main Class
``` ```
$ sysenv | grep MAIN $ thread -n -1 | grep 'main('
JAVA_MAIN_CLASS_71560 demo.MathGame at demo.MathGame.main(MathGame.java:17)
``` ```
## 5. 通过jad来反编绎Main Class ## 5. 通过jad来反编绎Main Class

@ -24,7 +24,7 @@ Affect(row-cnt:1) cost in 3 ms.
```bash ```bash
$ trace Test t >> & $ trace Test t >> &
job id : 2 job id : 2
cache location : /Users/zhuyong/logs/arthas-cache/28198/2 cache location : /Users/admin/logs/arthas-cache/28198/2
``` ```
此时命令会在后台异步执行,并将结果异步保存在文件(~/logs/arthas-cache/${PID}/${JobId})中; 此时命令会在后台异步执行,并将结果异步保存在文件(~/logs/arthas-cache/${PID}/${JobId})中;

@ -25,14 +25,21 @@ sc
### 使用参考 ### 使用参考
例如, 查看类的静态变量信息, 可以用`sc -df class-name` * 模糊搜索
```shell ```bash
$ sc -df org.apache.commons.lang.StringUtils $ sc demo.*
demo.MathGame
Affect(row-cnt:1) cost in 55 ms.
```
* 打印类的详细信息
class-info org.apache.commons.lang.StringUtils ```bash
code-source /Users/zhuyong/middleware/citrus-sample/petstore/web/target/petstore/WEB-INF/lib/commons-lang-2.4.jar $ sc -d demo.MathGame
name org.apache.commons.lang.StringUtils class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false isInterface false
isAnnotation false isAnnotation false
isEnum false isEnum false
@ -42,27 +49,52 @@ $ sc -df org.apache.commons.lang.StringUtils
isMemberClass false isMemberClass false
isPrimitive false isPrimitive false
isSynthetic false isSynthetic false
simple-name StringUtils simple-name MathGame
modifier public modifier public
annotation annotation
interfaces interfaces
super-class +-java.lang.Object super-class +-java.lang.Object
class-loader +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-org.apache.catalina.loader.StandardClassLoader@1d44eef3 +-sun.misc.Launcher$ExtClassLoader@66350f69
+-sun.misc.Launcher$AppClassLoader@57a462c9 classLoaderHash 3d4eac69
+-sun.misc.Launcher$ExtClassLoader@6951a712
fields modifier final,public,static Affect(row-cnt:1) cost in 875 ms.
type java.lang.String ```
name EMPTY
value * 打印出类的Field信息
modifier final,public,static ```bash
type int $ sc -d -f demo.MathGame
name INDEX_NOT_FOUND class-info demo.MathGame
value -1 code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
fields modifierprivate,static
type java.util.Random
name random
value java.util.Random@522b4
08a
modifier final,private,static modifierprivate
type int type int
name PAD_LIMIT name illegalArgumentCount
value 8192
Affect(row-cnt:1) cost in 19 ms.
``` ```

@ -18,71 +18,64 @@ sm
### 使用参考 ### 使用参考
``` ```bash
$ sm org.apache.catalina.connector.Connector $ sm java.lang.String
org.apache.catalina.connector.Connector-><init> java.lang.String-><init>
org.apache.catalina.connector.Connector->setProperty java.lang.String->equals
org.apache.catalina.connector.Connector->getProperty java.lang.String->toString
org.apache.catalina.connector.Connector->toString java.lang.String->hashCode
org.apache.catalina.connector.Connector->resume java.lang.String->compareTo
org.apache.catalina.connector.Connector->getScheme java.lang.String->indexOf
org.apache.catalina.connector.Connector->getProtocol java.lang.String->valueOf
org.apache.catalina.connector.Connector->getPort java.lang.String->checkBounds
org.apache.catalina.connector.Connector->setService java.lang.String->length
org.apache.catalina.connector.Connector->setPort java.lang.String->isEmpty
org.apache.catalina.connector.Connector->getService java.lang.String->charAt
org.apache.catalina.connector.Connector->getAttribute java.lang.String->codePointAt
org.apache.catalina.connector.Connector->setAttribute java.lang.String->codePointBefore
org.apache.catalina.connector.Connector->getLocalPort java.lang.String->codePointCount
org.apache.catalina.connector.Connector->pause java.lang.String->offsetByCodePoints
org.apache.catalina.connector.Connector->setProtocol java.lang.String->getChars
org.apache.catalina.connector.Connector->initInternal java.lang.String->getBytes
org.apache.catalina.connector.Connector->setSecure java.lang.String->contentEquals
org.apache.catalina.connector.Connector->getSecure java.lang.String->nonSyncContentEquals
org.apache.catalina.connector.Connector->startInternal java.lang.String->equalsIgnoreCase
org.apache.catalina.connector.Connector->stopInternal java.lang.String->compareToIgnoreCase
org.apache.catalina.connector.Connector->setScheme java.lang.String->regionMatches
org.apache.catalina.connector.Connector->createRequest java.lang.String->startsWith
org.apache.catalina.connector.Connector->getDomainInternal java.lang.String->endsWith
org.apache.catalina.connector.Connector->getProtocolHandler java.lang.String->indexOfSupplementary
org.apache.catalina.connector.Connector->setURIEncoding java.lang.String->lastIndexOf
org.apache.catalina.connector.Connector->findSslHostConfigs java.lang.String->lastIndexOfSupplementary
org.apache.catalina.connector.Connector->destroyInternal java.lang.String->substring
org.apache.catalina.connector.Connector->getObjectNameKeyProperties java.lang.String->subSequence
org.apache.catalina.connector.Connector->getAllowTrace java.lang.String->concat
org.apache.catalina.connector.Connector->setAllowTrace java.lang.String->replace
org.apache.catalina.connector.Connector->getAsyncTimeout java.lang.String->matches
org.apache.catalina.connector.Connector->setAsyncTimeout java.lang.String->contains
org.apache.catalina.connector.Connector->getEnableLookups java.lang.String->replaceFirst
org.apache.catalina.connector.Connector->setEnableLookups java.lang.String->replaceAll
org.apache.catalina.connector.Connector->getMaxCookieCount java.lang.String->split
... java.lang.String->join
java.lang.String->toLowerCase
java.lang.String->toUpperCase
java.lang.String->trim
java.lang.String->toCharArray
java.lang.String->format
java.lang.String->copyValueOf
java.lang.String->intern
Affect(row-cnt:44) cost in 1342 ms.
``` ```
```bash ```bash
$ sm org.apache.catalina.connector.Connector -d $ sm -d java.lang.String toString
declaring-class org.apache.catalina.connector.Connector declaring-class java.lang.String
constructor-name <init> method-name toString
modifier public modifier public
annotation annotation
parameters parameters
return java.lang.String
exceptions exceptions
declaring-class org.apache.catalina.connector.Connector Affect(row-cnt:1) cost in 3 ms.
constructor-name <init>
modifier public
annotation
parameters java.lang.String
exceptions
declaring-class org.apache.catalina.connector.Connector
method-name setProperty
modifier public
annotation
parameters java.lang.String
java.lang.String
return boolean
exceptions
......
``` ```

@ -31,274 +31,202 @@ watch 的参数比较多,主要是因为它能在 4 个不同的场景观察
**特别说明** **特别说明**
* watch 命令定义了4个观察事件点即 `-b` 方法调用前,`-e` 方法异常后,`-s` 方法返回后`-f` 方法结束后 * watch 命令定义了4个观察事件点即 `-b` 方法调用前,`-e` 方法异常后,`-s` 方法返回后`-f` 方法结束后
* 4个观察事件点 `-b`、`-e`、`-s` 默认关闭,`-f` 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出 * 4个观察事件点 `-b`、`-e`、`-s` 默认关闭,`-f` 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出
* 这里要注意`方法入参`和`方法出参`的区别,有可能在中间被修改导致前后不一致,除了 `-b` 事件点 `params` 代表方法入参外,其余事件都代表方法出参 * 这里要注意`方法入参`和`方法出参`的区别,有可能在中间被修改导致前后不一致,除了 `-b` 事件点 `params` 代表方法入参外,其余事件都代表方法出参
* 当使用 `-b` 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在 * 当使用 `-b` 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在
### 使用参考 ### 使用参考
代码示例: 启动[快速入门](quick-start.md)里的`arthas-demo`。
```java
public void execute() {
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) {
list.addAll(list2);
return list.size();
}
```
#### 观察方法出参和返回值 #### 观察方法出参和返回值
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 2 $ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms. Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
@ArrayList[ ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=4], @Integer[535629513],
@ArrayList[isEmpty=false;size=2], ],
@ArrayList[
@Integer[3],
@Integer[19],
@Integer[191],
@Integer[49199],
], ],
@Integer[4],
] ]
``` ```
#### 观察方法入参 #### 观察方法入参
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 2 -b $ watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 48 ms. Affect(class-cnt:1 , method-cnt:1) cost in 50 ms.
@ArrayList[ ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=2], @Integer[-1077465243],
@ArrayList[isEmpty=false;size=2],
], ],
null, null,
] ]
``` ```
> 对比前一个例子params[0] 其size为2入参,返回值为空(事件点为方法执行前,因此获取不到返回值) * 对比前一个例子,返回值为空(事件点为方法执行前,因此获取不到返回值)
#### 同时观察方法调用前和方法返回后 #### 同时观察方法调用前和方法返回后
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 2 -b -s $ watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 59 ms. Affect(class-cnt:1 , method-cnt:1) cost in 46 ms.
@ArrayList[ ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=2], @Integer[1544665400],
@ArrayList[isEmpty=false;size=2], ],
@MathGame[
random=@Random[java.util.Random@522b408a],
illegalArgumentCount=@Integer[13038],
], ],
null, null,
] ]
@ArrayList[ ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=4], @Integer[1544665400],
@ArrayList[isEmpty=false;size=2], ],
@MathGame[
random=@Random[java.util.Random@522b408a],
illegalArgumentCount=@Integer[13038],
],
@ArrayList[
@Integer[2],
@Integer[2],
@Integer[2],
@Integer[5],
@Integer[5],
@Integer[73],
@Integer[241],
@Integer[439],
], ],
@Integer[4],
] ]
``` ```
>这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果 * 参数里`-n 2`,表示只执行两次
>结果的顺序和命令中 `-s -b` 的顺序没有关系,只与事件本身的先后顺序有关 * 这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果
* 结果的顺序和命令中 `-s -b` 的顺序没有关系,只与事件本身的先后顺序有关
#### 调整`-x`的值,观察具体的方法参数值 #### 调整`-x`的值,观察具体的方法参数值
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 3 $ watch demo.MathGame primeFactors "{params,target}" -x 3
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 59 ms. Affect(class-cnt:1 , method-cnt:1) cost in 58 ms.
@ArrayList[ ts=2018-12-03 19:34:19; [cost=0.587833ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[ @Integer[47816758],
@String[a],
@String[b],
@String[c],
@String[d],
], ],
@ArrayList[ @MathGame[
@String[c], random=@Random[
serialVersionUID=@Long[3905348978240129619],
@String[d], seed=@AtomicLong[3133719055989],
multiplier=@Long[25214903917],
addend=@Long[11],
mask=@Long[281474976710655],
DOUBLE_UNIT=@Double[1.1102230246251565E-16],
BadBound=@String[bound must be positive],
BadRange=@String[bound must be greater than origin],
BadSize=@String[size must be non-negative],
seedUniquifier=@AtomicLong[-3282039941672302964],
nextNextGaussian=@Double[0.0],
haveNextNextGaussian=@Boolean[false],
serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027],
seedOffset=@Long[24],
], ],
illegalArgumentCount=@Integer[13159],
], ],
@Integer[4],
] ]
``` ```
>`-x`表示遍历深度,可以调整来打印具体的参数和结果内容。 * `-x`表示遍历深度,可以调整来打印具体的参数和结果内容默认值是1
#### 条件表达式的例子 #### 条件表达式的例子
```shell ```bash
$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd "{params, returnObj}" "params[0].equals('aaa')" -x 2 $ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 29 ms. Affect(class-cnt:1 , method-cnt:1) cost in 68 ms.
@ArrayList[ ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[
@Object[][ @Integer[-18178089],
@String[aaa], @MathGame[demo.MathGame@41cf53f9],
@String[bbb],
],
@Integer[6],
] ]
``` ```
>只有满足条件的调用,才会有响应。 * 只有满足条件的调用,才会有响应。
#### 观察异常信息的例子 #### 观察异常信息的例子
```shell ```bash
$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd "{params, throwExp}" -e -x 2 $ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 29 ms. Affect(class-cnt:1 , method-cnt:1) cost in 62 ms.
@ArrayList[ ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[
@Object[][ @Integer[-1120397038],
@String[aaa], java.lang.IllegalArgumentException: number is: -1120397038, need >= 2
@String[bbb], at demo.MathGame.primeFactors(MathGame.java:46)
], at demo.MathGame.run(MathGame.java:24)
at demo.MathGame.main(MathGame.java:16)
java.lang.NullPointerException ,
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.testAdd(UserManagerImpl.java:75)
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.register(UserManagerImpl.java:60)
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction.doRegister(RegisterAction.java:45)
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction$$FastClassByCGLIB$$ad5428f1.invoke(<generated>)
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.AbstractModuleEventAdapter.executeAndReturn(AbstractModuleEventAdapter.java:100)
at com.alibaba.citrus.service.moduleloader.impl.adapter.AbstractModuleEventAdapter.execute(AbstractModuleEventAdapter.java:58)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:63)
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)
at com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.doFilter(WebxFrameworkFilter.java:152)
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter(FilterBean.java:148)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.alibaba.citrus.webx.servlet.SetLoggingContextFilter.doFilter(SetLoggingContextFilter.java:61)
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter(FilterBean.java:148)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:152)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1760)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1719)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745),
] ]
``` ```
>express中表示异常信息的变量是`throwExp` * `-e`表示抛出异常时才触发
* express中表示异常信息的变量是`throwExp`
#### 按照耗时进行过滤 #### 按照耗时进行过滤
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" #cost>200 -x 3 $ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 59 ms. Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
@ArrayList[ ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[ @Integer[2141897465],
@String[a],
@String[b],
@String[c],
@String[d],
], ],
@ArrayList[ @ArrayList[
@String[c], @Integer[5],
@Integer[428379493],
@String[d],
],
], ],
@Integer[4],
] ]
``` ```
>#cost>200(单位是`ms`)表示只有当耗时大于200ms时才会输出过滤掉执行时间小于200ms的调用 * `#cost>200`(单位是`ms`)表示只有当耗时大于200ms时才会输出过滤掉执行时间小于200ms的调用
#### 观察当前对象中的全局属性 #### 观察当前对象中的属性
如果想查看方法运行前后,当前对象中的全局属性,可以使用`target`关键字,代表当前对象 如果想查看方法运行前后,当前对象中的属性,可以使用`target`关键字,代表当前对象
``` ```bash
$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps 'target' $ watch demo.MathGame primeFactors 'target'
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 128 ms. Affect(class-cnt:1 , method-cnt:1) cost in 52 ms.
ts=2017-10-31 18:45:55;result=@MyAppsController[ ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
myFavAppsMapper=@$Proxy131[org.apache.ibatis.binding.MapperProxy@563e97f3], random=@Random[java.util.Random@522b408a],
getAppNameAndIdByEmpId=@$Proxy135[HardCodedTarget(type=GetAppNameAndIdByEmpId, url=http://hello.com)], illegalArgumentCount=@Integer[13355],
enableWebConsoleAppsMapper=@$Proxy132[org.apache.ibatis.binding.MapperProxy@7d51e4a8],
] ]
``` ```
然后使用`target.field_name`访问当前对象的某个全局属性 然后使用`target.field_name`访问当前对象的某个属性
``` ```
$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps 'target.myFavAppsMapper' $ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 126 ms. Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2017-10-31 18:46:17;result=@$Proxy131[ ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
m1=@Method[public boolean java.lang.Object.equals(java.lang.Object)], ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
m2=@Method[public java.lang.String java.lang.Object.toString()],
m5=@Method[public abstract java.util.List com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.listFavApps(java.util.Map)],
m3=@Method[public abstract int com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.delete(java.lang.String,java.lang.String,java.lang.String)],
m4=@Method[public abstract long com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.insert(com.taobao.container.dal.arthas.domain.MyFavAppsDO)],
m0=@Method[public native int java.lang.Object.hashCode()],
]
``` ```

@ -107,7 +107,15 @@
<li class="toctree-l2"><a class="reference internal" href="jad.html">jad</a></li> <li class="toctree-l2"><a class="reference internal" href="jad.html">jad</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">classloader</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">classloader</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="#">按类加载类型查看统计信息</a></li>
<li class="toctree-l4"><a class="reference internal" href="#">按类加载实例查看统计信息</a></li>
<li class="toctree-l4"><a class="reference internal" href="#classloader">查看ClassLoader的继承树</a></li>
<li class="toctree-l4"><a class="reference internal" href="#urlclassloaderurls">查看URLClassLoader实际的urls</a></li>
<li class="toctree-l4"><a class="reference internal" href="#classloaderresource">使用ClassLoader去查找resource</a></li>
<li class="toctree-l4"><a class="reference internal" href="#classloader">使用ClassLoader去加载类</a></li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="redefine.html">redefine</a></li> <li class="toctree-l2"><a class="reference internal" href="redefine.html">redefine</a></li>
@ -230,120 +238,102 @@
<td align="right"><code>[c: r:]</code></td> <td align="right"><code>[c: r:]</code></td>
<td align="left">用ClassLoader去查找resource</td> <td align="left">用ClassLoader去查找resource</td>
</tr> </tr>
<tr>
<td align="right"><code>[c: load:]</code></td>
<td align="left">用ClassLoader去加载指定的类</td>
</tr>
</tbody> </tbody>
</table></div> </table></div>
<div class="section" id=""> <div class="section" id="">
<span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<ul class="simple"> <div class="section" id="">
<li>按类加载类型查看统计信息</li> <span id="id3"></span><h3>按类加载类型查看统计信息<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
</ul> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader
<div class="highlight-s notranslate"><div class="highlight"><pre><span></span><span class="o">$</span> classloader
name numberOfInstances loadedCountTotal name numberOfInstances loadedCountTotal
com.taobao.pandora.service.loader.ModuleClassLoader <span class="m">29</span> <span class="m">11659</span> com.taobao.arthas.agent.ArthasClassloader <span class="m">1</span> <span class="m">2115</span>
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader <span class="m">1</span> <span class="m">5308</span> BootstrapClassLoader <span class="m">1</span> <span class="m">1861</span>
BootstrapClassLoader <span class="m">1</span> <span class="m">3711</span> sun.reflect.DelegatingClassLoader <span class="m">5</span> <span class="m">5</span>
com.taobao.arthas.agent.ArthasClassloader <span class="m">2</span> <span class="m">2825</span> sun.misc.Launcher<span class="nv">$AppClassLoader</span> <span class="m">1</span> <span class="m">4</span>
sun.reflect.DelegatingClassLoader <span class="m">332</span> <span class="m">332</span> sun.misc.Launcher<span class="nv">$ExtClassLoader</span> <span class="m">1</span> <span class="m">1</span>
java.net.URLClassLoader <span class="m">1</span> <span class="m">285</span> Affect<span class="o">(</span>row-cnt:5<span class="o">)</span> cost in <span class="m">3</span> ms.
sun.misc.Launcher<span class="o">$</span>AppClassLoader <span class="m">1</span> <span class="m">77</span>
sun.misc.Launcher<span class="o">$</span>ExtClassLoader <span class="m">1</span> <span class="m">46</span>
com.alibaba.fastjson.util.ASMClassLoader <span class="m">2</span> <span class="m">3</span>
org.jvnet.hk2.internal.DelegatingClassLoader <span class="m">2</span> <span class="m">2</span>
sun.reflect.misc.MethodUtil <span class="m">1</span> <span class="m">1</span>
Affect<span class="p">(</span><span class="kp">row</span><span class="o">-</span>cnt<span class="o">:</span><span class="m">11</span><span class="p">)</span> cost <span class="kr">in</span> <span class="m">66</span> ms.
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>按类加载实例查看统计信息</li> <div class="section" id="">
</ul> <span id="id4"></span><h3>按类加载实例查看统计信息<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -l <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -l
name loadedCount hash parent name loadedCount <span class="nb">hash</span> parent
BootstrapClassLoader 3711 null null BootstrapClassLoader <span class="m">1861</span> null null
com.alibaba.fastjson.util.ASMClassLoader@3bbaa1b8 2 3bbaa1b8 monitor&#39;s ModuleClassLoader com.taobao.arthas.agent.ArthasClassloader@68b31f0a <span class="m">2115</span> 68b31f0a sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
com.alibaba.fastjson.util.ASMClassLoader@5e255d0b 1 5e255d0b eagleeye-core&#39;s ModuleClassLoader sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69 <span class="m">4</span> 3d4eac69 sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
com.taobao.arthas.agent.ArthasClassloader@4fa2d7e6 1795 4fa2d7e6 sun.misc.Launcher$ExtClassLoader@a38d7a3 sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69 <span class="m">1</span> 66350f69 null
com.taobao.arthas.agent.ArthasClassloader@522400c2 1033 522400c2 sun.misc.Launcher$ExtClassLoader@a38d7a3 Affect<span class="o">(</span>row-cnt:4<span class="o">)</span> cost in <span class="m">2</span> ms.
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444 5308 1817d444 sun.misc.Launcher$AppClassLoader@14dad5dc
tbsession&#39;s ModuleClassLoader 285 609cd4d8 null
pandora-qos-service&#39;s ModuleClassLoader 267 2f8dad04 null
pandora-framework&#39;s ModuleClassLoader 78 4009e306 null
filesync-client&#39;s ModuleClassLoader 4 4b8ee4de null
rocketmq-client&#39;s ModuleClassLoader 431 247bddad null
eagleeye-core&#39;s ModuleClassLoader 451 1ba9117e null
alimonitor-jmonitor&#39;s ModuleClassLoader 134 22fcf7ab null
metaq-client&#39;s ModuleClassLoader 35 41a2befb null
hsf-mock&#39;s ModuleClassLoader 3 2002fc1d null
monitor&#39;s ModuleClassLoader 1427 131ef10 null
spas-sdk-service&#39;s ModuleClassLoader 7 10d307f1 null
vipserver-client&#39;s ModuleClassLoader 137 7a419da4 null
metrics&#39;s ModuleClassLoader 146 696da30b null
mtop-uncenter&#39;s ModuleClassLoader 922 79d8407f null
spas-sdk-client&#39;s ModuleClassLoader 235 4944252c null
live-profiler-pandora&#39;s ModuleClassLoader 1 6913c1fb null
notify-tr-client&#39;s ModuleClassLoader 472 fba92d3 null
ons-sdk&#39;s ModuleClassLoader 70 23348b5d null
tair-plugin&#39;s ModuleClassLoader 1053 7c9d8e2 null
tddl-client&#39;s ModuleClassLoader 2354 4988d8b8 null
config-client&#39;s ModuleClassLoader 93 429bffaa null
diamond-client&#39;s ModuleClassLoader 360 3d5c822d null
pandolet&#39;s ModuleClassLoader 99 41e1e210 null
hsf&#39;s ModuleClassLoader 1796 3232a28a null
acl.plugin&#39;s ModuleClassLoader 379 67080771 null
buc.sso.client.plugin&#39;s ModuleClassLoader 195 13b6aecc null
unitrouter&#39;s ModuleClassLoader 64 7e5afaa6 null
switch&#39;s ModuleClassLoader 104 24313fcc null
hsf-notify-client&#39;s ModuleClassLoader 57 4d0f2471 null
java.net.URLClassLoader@7ec7ffd3 285 7ec7ffd3 sun.misc.Launcher$ExtClassLoader@a38d7a3
javax.management.remote.rmi.NoCallStackClassLoader@53f65459 1 53f65459 null
javax.management.remote.rmi.NoCallStackClassLoader@2833cc44 1 2833cc44 null
org.jvnet.hk2.internal.DelegatingClassLoader@72cda8ee 1 72cda8ee monitor&#39;s ModuleClassLoader
org.jvnet.hk2.internal.DelegatingClassLoader@1f57f96d 1 1f57f96d monitor&#39;s ModuleClassLoader
sun.misc.Launcher$AppClassLoader@14dad5dc 77 14dad5dc sun.misc.Launcher$ExtClassLoader@a38d7a3
sun.misc.Launcher$ExtClassLoader@a38d7a3 46 a38d7a3 null
sun.reflect.misc.MethodUtil@1201f221 1 1201f221 sun.misc.Launcher$AppClassLoader@14dad5dc
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>查看ClassLoader的继承树</li> <div class="section" id="classloader">
</ul> <span id="id5"></span><h3>查看ClassLoader的继承树<a class="headerlink" href="#classloader" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -t <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -t
+-BootstrapClassLoader +-BootstrapClassLoader
+-unitrouter<span class="s1">&#39;s ModuleClassLoader</span> +-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
<span class="s1">+-diamond-client&#39;</span>s ModuleClassLoader +-com.taobao.arthas.agent.ArthasClassloader@68b31f0a
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@548a102f +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="p">|</span> +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@14dad5dc Affect<span class="o">(</span>row-cnt:4<span class="o">)</span> cost in <span class="m">3</span> ms.
<span class="p">|</span> +-com.taobao.arthas.agent.AgentLauncher<span class="nv">$1</span>@334e6bb8
<span class="p">|</span> <span class="p">|</span> +-sun.reflect.DelegatingClassLoader@328b3a05
<span class="p">|</span> <span class="p">|</span> +-sun.reflect.DelegatingClassLoader@73f44f24
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>查看URLClassLoader实际的urls</li> <div class="section" id="urlclassloaderurls">
</ul> <span id="urlclassloaderurls"></span><h3>查看URLClassLoader实际的urls<a class="headerlink" href="#urlclassloaderurls" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 5ffe9775 <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 3d4eac69
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/commons-lang-2.6.jar file:/private/tmp/arthas-demo.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/log4j-1.2.16.jar file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/logger.api-0.1.4.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.api-2.0.7-SNAPSHOT.jar Affect<span class="o">(</span>row-cnt:9<span class="o">)</span> cost in <span class="m">3</span> ms.
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.container-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.thirdcontainer-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/picocontainer-2.14.3.jar
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>使用ClassLoader去查找resource</li> <div class="section" id="classloaderresource">
</ul> <span id="classloaderresource"></span><h3>使用ClassLoader去查找resource<a class="headerlink" href="#classloaderresource" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 226b143b -r META-INF/MANIFEST.MF <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/private/tmp/arthas-demo.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF
</pre></div> </pre></div>
</div> </div>
<p>也可以尝试查找类的class文件</p> <p>也可以尝试查找类的class文件</p>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 1b6d3586 -r java/lang/String.class <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 1b6d3586 -r java/lang/String.class
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="classloader">
<span id="id6"></span><h3>使用ClassLoader去加载类<a class="headerlink" href="#classloader" title="永久链接至标题"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 3d4eac69 --load demo.MathGame
load class success.
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface <span class="nb">false</span>
isAnnotation <span class="nb">false</span>
isEnum <span class="nb">false</span>
isAnonymousClass <span class="nb">false</span>
isArray <span class="nb">false</span>
isLocalClass <span class="nb">false</span>
isMemberClass <span class="nb">false</span>
isPrimitive <span class="nb">false</span>
isSynthetic <span class="nb">false</span>
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
classLoaderHash 3d4eac69
</pre></div>
</div>
</div>
</div>
</div> </div>

@ -224,29 +224,17 @@
</table></div> </table></div>
<div class="section" id=""> <div class="section" id="">
<span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ dump -E org<span class="se">\.</span>apache<span class="se">\.</span>commons<span class="se">\.</span>lang<span class="se">\.</span>StringUtils <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ dump java.lang.String
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
29505d69 +-tddl-client<span class="s1">&#39;s ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora</span> null /Users/admin/logs/arthas/classdump/java/lang/String.class
<span class="s1"> .service.loader.ModuleClassLoader-29505d69/org.apache.commons.lang.StringUtils.class</span> Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">119</span> ms.
<span class="s1"> 6e51ad67 +-java.net.URLClassLoader@6e51ad67 /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL</span> </pre></div>
<span class="s1"> +-sun.misc.Launcher$AppClassLoader@6951a712 oader-6e51ad67/org.apache.commons.lang.StringUtils.class</span> </div>
<span class="s1"> +-sun.misc.Launcher$ExtClassLoader@6fafc4c2</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ dump demo.*
<span class="s1"> 2bdd9114 +-pandora-qos-service&#39;</span>s ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora
.service.loader.ModuleClassLoader-2bdd9114/org.apache.commons.lang.StringUtils.class
544dc9ba +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.tomcat.
+-org.apache.catalina.loader.StandardClassLoader@2302e984 container.context.loader.AliWebappClassLoader-544dc9ba/org.apache.commons.lang.String
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@6951a712 Utils.class
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6fafc4c2
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@6951a712 oader-22880c2b/org.apache.commons.lang.StringUtils.class
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6fafc4c2
Affect<span class="o">(</span>row-cnt:5<span class="o">)</span> cost in <span class="m">156</span> ms.
$ dump -E org<span class="se">\.</span>apache<span class="se">\.</span>commons<span class="se">\.</span>lang<span class="se">\.</span>StringUtils -c 22880c2b
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassLoader-22880c2b/org 3d4eac69 +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher<span class="nv">$AppClassLoader</span>-3d4eac69/demo/MathGame.class
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@6951a712 .apache.commons.lang.StringUtils.class +-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6fafc4c2 Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">39</span> ms.
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">67</span> ms.
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -28,7 +28,7 @@ Advanced Usage
* [sm](sm.md) - check methods info for the loaded classes * [sm](sm.md) - check methods info for the loaded classes
* [dump](dump.md) - dump the loaded classes in byte code to the specified location * [dump](dump.md) - dump the loaded classes in byte code to the specified location
* [redefine](redefine.md) - load external `*.class` files and re-define it into JVM * [redefine](redefine.md) - load external `*.class` files and re-define it into JVM
* [jad](jad.md) - de-compile the specified loaded classes * [jad](jad.md) - decompile the specified loaded classes
* [classloader](classloader.md) - check the inheritance structure, urls, class loading info for the specified class; using classloader to get the url of the resource e.g. `java/lang/String.class` * [classloader](classloader.md) - check the inheritance structure, urls, class loading info for the specified class; using classloader to get the url of the resource e.g. `java/lang/String.class`
## monitor/watch/trace - related ## monitor/watch/trace - related

@ -13,117 +13,96 @@ View hierarchy, urls and classes-loading info for the class-loaders.
|[t]|print classloader's hierarchy| |[t]|print classloader's hierarchy|
|[a]|list all the classes loaded by all the classloaders (use it with great caution since the output can be huge)| |[a]|list all the classes loaded by all the classloaders (use it with great caution since the output can be huge)|
|[c:]|print classloader's hashcode| |[c:]|print classloader's hashcode|
|[c: r:]|using class loader to search resource| |`[c: r:]`|using ClassLoader to search resource|
|`[c: load:]`|using ClassLoader to load class|
### Usage ### Usage
* View statistics categorized by class type #### View statistics categorized by class type
```bash ```bash
$ classloader $ classloader
name numberOfInstances loadedCountTotal name numberOfInstances loadedCountTotal
com.taobao.pandora.service.loader.ModuleClassLoader 29 11659 com.taobao.arthas.agent.ArthasClassloader 1 2115
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader 1 5308 BootstrapClassLoader 1 1861
BootstrapClassLoader 1 3711 sun.reflect.DelegatingClassLoader 5 5
com.taobao.arthas.agent.ArthasClassloader 2 2825 sun.misc.Launcher$AppClassLoader 1 4
sun.reflect.DelegatingClassLoader 332 332 sun.misc.Launcher$ExtClassLoader 1 1
java.net.URLClassLoader 1 285 Affect(row-cnt:5) cost in 3 ms.
sun.misc.Launcher$AppClassLoader 1 77
sun.misc.Launcher$ExtClassLoader 1 46
com.alibaba.fastjson.util.ASMClassLoader 2 3
org.jvnet.hk2.internal.DelegatingClassLoader 2 2
sun.reflect.misc.MethodUtil 1 1
Affect(row-cnt:11) cost in 66 ms.
``` ```
* View statistics categorized by loaded classes number #### View statistics categorized by loaded classes number
```bash ```bash
$ classloader -l $ classloader -l
name loadedCount hash parent name loadedCount hash parent
BootstrapClassLoader 3711 null null BootstrapClassLoader 1861 null null
com.alibaba.fastjson.util.ASMClassLoader@3bbaa1b8 2 3bbaa1b8 monitor's ModuleClassLoader com.taobao.arthas.agent.ArthasClassloader@68b31f0a 2115 68b31f0a sun.misc.Launcher$ExtClassLoader@66350f69
com.alibaba.fastjson.util.ASMClassLoader@5e255d0b 1 5e255d0b eagleeye-core's ModuleClassLoader sun.misc.Launcher$AppClassLoader@3d4eac69 4 3d4eac69 sun.misc.Launcher$ExtClassLoader@66350f69
com.taobao.arthas.agent.ArthasClassloader@4fa2d7e6 1795 4fa2d7e6 sun.misc.Launcher$ExtClassLoader@a38d7a3 sun.misc.Launcher$ExtClassLoader@66350f69 1 66350f69 null
com.taobao.arthas.agent.ArthasClassloader@522400c2 1033 522400c2 sun.misc.Launcher$ExtClassLoader@a38d7a3 Affect(row-cnt:4) cost in 2 ms.
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444 5308 1817d444 sun.misc.Launcher$AppClassLoader@14dad5dc
tbsession's ModuleClassLoader 285 609cd4d8 null
pandora-qos-service's ModuleClassLoader 267 2f8dad04 null
pandora-framework's ModuleClassLoader 78 4009e306 null
filesync-client's ModuleClassLoader 4 4b8ee4de null
rocketmq-client's ModuleClassLoader 431 247bddad null
eagleeye-core's ModuleClassLoader 451 1ba9117e null
alimonitor-jmonitor's ModuleClassLoader 134 22fcf7ab null
metaq-client's ModuleClassLoader 35 41a2befb null
hsf-mock's ModuleClassLoader 3 2002fc1d null
monitor's ModuleClassLoader 1427 131ef10 null
spas-sdk-service's ModuleClassLoader 7 10d307f1 null
vipserver-client's ModuleClassLoader 137 7a419da4 null
metrics's ModuleClassLoader 146 696da30b null
mtop-uncenter's ModuleClassLoader 922 79d8407f null
spas-sdk-client's ModuleClassLoader 235 4944252c null
live-profiler-pandora's ModuleClassLoader 1 6913c1fb null
notify-tr-client's ModuleClassLoader 472 fba92d3 null
ons-sdk's ModuleClassLoader 70 23348b5d null
tair-plugin's ModuleClassLoader 1053 7c9d8e2 null
tddl-client's ModuleClassLoader 2354 4988d8b8 null
config-client's ModuleClassLoader 93 429bffaa null
diamond-client's ModuleClassLoader 360 3d5c822d null
pandolet's ModuleClassLoader 99 41e1e210 null
hsf's ModuleClassLoader 1796 3232a28a null
acl.plugin's ModuleClassLoader 379 67080771 null
buc.sso.client.plugin's ModuleClassLoader 195 13b6aecc null
unitrouter's ModuleClassLoader 64 7e5afaa6 null
switch's ModuleClassLoader 104 24313fcc null
hsf-notify-client's ModuleClassLoader 57 4d0f2471 null
java.net.URLClassLoader@7ec7ffd3 285 7ec7ffd3 sun.misc.Launcher$ExtClassLoader@a38d7a3
javax.management.remote.rmi.NoCallStackClassLoader@53f65459 1 53f65459 null
javax.management.remote.rmi.NoCallStackClassLoader@2833cc44 1 2833cc44 null
org.jvnet.hk2.internal.DelegatingClassLoader@72cda8ee 1 72cda8ee monitor's ModuleClassLoader
org.jvnet.hk2.internal.DelegatingClassLoader@1f57f96d 1 1f57f96d monitor's ModuleClassLoader
sun.misc.Launcher$AppClassLoader@14dad5dc 77 14dad5dc sun.misc.Launcher$ExtClassLoader@a38d7a3
sun.misc.Launcher$ExtClassLoader@a38d7a3 46 a38d7a3 null
sun.reflect.misc.MethodUtil@1201f221 1 1201f221 sun.misc.Launcher$AppClassLoader@14dad5dc
``` ```
* View class-loaders hierarchy #### View class-loaders hierarchy
```shell ```bash
$ classloader -t $ classloader -t
+-BootstrapClassLoader +-BootstrapClassLoader
+-unitrouter's ModuleClassLoader +-sun.misc.Launcher$ExtClassLoader@66350f69
+-diamond-client's ModuleClassLoader +-com.taobao.arthas.agent.ArthasClassloader@68b31f0a
+-sun.misc.Launcher$ExtClassLoader@548a102f +-sun.misc.Launcher$AppClassLoader@3d4eac69
| +-sun.misc.Launcher$AppClassLoader@14dad5dc Affect(row-cnt:4) cost in 3 ms.
| +-com.taobao.arthas.agent.AgentLauncher$1@334e6bb8
| | +-sun.reflect.DelegatingClassLoader@328b3a05
| | +-sun.reflect.DelegatingClassLoader@73f44f24
``` ```
* Show the URLs from which to load classes and resources for one particular URLClassLoader #### Show the URLs of the URLClassLoader
```shell ```bash
$ classloader -c 5ffe9775 $ classloader -c 3d4eac69
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/commons-lang-2.6.jar file:/private/tmp/arthas-demo.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/log4j-1.2.16.jar file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/logger.api-0.1.4.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.api-2.0.7-SNAPSHOT.jar Affect(row-cnt:9) cost in 3 ms.
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.container-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.thirdcontainer-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/picocontainer-2.14.3.jar
``` ```
* Use one class loader to search one particular resource #### Use the classloader to load resource
```shell ```bash
$ classloader -c 226b143b -r META-INF/MANIFEST.MF $ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/private/tmp/arthas-demo.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF
``` ```
* Use one class loader to search one particular class Use the classloader to load `.class` resource
```shell ```shell
$ classloader -c 1b6d3586 -r java/lang/String.class $ classloader -c 1b6d3586 -r java/lang/String.class
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class
``` ```
#### Use the classloader to load class
```bash
$ classloader -c 3d4eac69 --load demo.MathGame
load class success.
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
```

@ -14,27 +14,16 @@ dump
### Usage ### Usage
```bash ```bash
$ dump org.apache.commons.lang.StringUtils $ dump java.lang.String
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
29505d69 +-tddl-client's ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora null /Users/admin/logs/arthas/classdump/java/lang/String.class
.service.loader.ModuleClassLoader-29505d69/org.apache.commons.lang.StringUtils.class Affect(row-cnt:1) cost in 119 ms.
6e51ad67 +-java.net.URLClassLoader@6e51ad67 /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL ```
+-sun.misc.Launcher$AppClassLoader@6951a712 oader-6e51ad67/org.apache.commons.lang.StringUtils.class
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2 ```bash
2bdd9114 +-pandora-qos-service's ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora $ dump demo.*
.service.loader.ModuleClassLoader-2bdd9114/org.apache.commons.lang.StringUtils.class
544dc9ba +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.tomcat.
+-org.apache.catalina.loader.StandardClassLoader@2302e984 container.context.loader.AliWebappClassLoader-544dc9ba/org.apache.commons.lang.String
+-sun.misc.Launcher$AppClassLoader@6951a712 Utils.class
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL
+-sun.misc.Launcher$AppClassLoader@6951a712 oader-22880c2b/org.apache.commons.lang.StringUtils.class
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2
Affect(row-cnt:5) cost in 156 ms.
$ dump -E org\.apache\.commons\.lang\.StringUtils -c 22880c2b
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassLoader-22880c2b/org 3d4eac69 +-sun.misc.Launcher$AppClassLoader@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher$AppClassLoader-3d4eac69/demo/MathGame.class
+-sun.misc.Launcher$AppClassLoader@6951a712 .apache.commons.lang.StringUtils.class +-sun.misc.Launcher$ExtClassLoader@66350f69
+-sun.misc.Launcher$ExtClassLoader@6fafc4c2 Affect(row-cnt:1) cost in 39 ms.
Affect(row-cnt:1) cost in 67 ms.
``` ```

@ -1,9 +1,38 @@
getstatic getstatic
========= =========
* It is recommended to use the [OGNL] (ognl.md) command, which will be more flexibility.
Check the static fields of classes conveniently, the usage is `getstatic class_name field_name`. Check the static fields of classes conveniently, the usage is `getstatic class_name field_name`.
Tip: if the static field is a complex class, you can even use [`OGNL`](https://en.wikipedia.org/wiki/OGNL) to traverse, filter and access the inner properties of this class. ```bash
$ getstatic demo.MathGame random
field: random
@Random[
serialVersionUID=@Long[3905348978240129619],
seed=@AtomicLong[120955813885284],
multiplier=@Long[25214903917],
addend=@Long[11],
mask=@Long[281474976710655],
DOUBLE_UNIT=@Double[1.1102230246251565E-16],
BadBound=@String[bound must be positive],
BadRange=@String[bound must be greater than origin],
BadSize=@String[size must be non-negative],
seedUniquifier=@AtomicLong[-3282039941672302964],
nextNextGaussian=@Double[0.0],
haveNextNextGaussian=@Boolean[false],
serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027],
seedOffset=@Long[24],
]
```
Tip: if the static field is a complex class, you can even use [`OGNL`](https://commons.apache.org/proper/commons-ognl/language-guide.html) to traverse, filter and access the inner properties of this class.
* [OGNL official guide](https://commons.apache.org/proper/commons-ognl/language-guide.html)
* [Special usages](https://github.com/alibaba/arthas/issues/71)
E.g. suppose `n` is a `Map` and its key is a `Enum`, then you can achieve this if you want to pick the key with a specific `Enum` value: E.g. suppose `n` is a `Map` and its key is a `Enum`, then you can achieve this if you want to pick the key with a specific `Enum` value:

@ -4,19 +4,19 @@ Install Arthas
## Quick installation ## Quick installation
### Use `arthas-boot` ### Use `arthas-boot`(Recommend)
Download`arthas-boot.jar`Start with `java` command: Download`arthas-boot.jar`Start with `java` command:
```bash ```bash
wget https://alibaba.github.io/arthas/arthas-boot.jar $ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
``` ```
Print usage: Print usage:
```bash ```bash
java -jar arthas-boot.jar -h $ java -jar arthas-boot.jar -h
``` ```
@ -25,7 +25,7 @@ java -jar arthas-boot.jar -h
You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press *Enter* to run: You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press *Enter* to run:
```bash ```bash
curl -L https://alibaba.github.io/arthas/install.sh | sh $ curl -L https://alibaba.github.io/arthas/install.sh | sh
``` ```
The command above will download the bootstrap script `as.sh` to the current directory. You can move it the any other place you want, or put its location in `$PATH`. The command above will download the bootstrap script `as.sh` to the current directory. You can move it the any other place you want, or put its location in `$PATH`.
@ -40,13 +40,13 @@ Latest Version, Click To Download: [![Arthas](https://img.shields.io/maven-centr
Download and unzip, find `arthas-boot.jar` in the directory. Start with `java` command: Download and unzip, find `arthas-boot.jar` in the directory. Start with `java` command:
```bash ```bash
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
``` ```
Print usage: Print usage:
```bash ```bash
java -jar arthas-boot.jar -h $ java -jar arthas-boot.jar -h
``` ```
## Manual Installation ## Manual Installation
@ -64,7 +64,7 @@ Latest Version, Click To Download:[![Arthas](https://img.shields.io/maven-centra
* On Linux/Unix/Mac, delete the files with the following command: * On Linux/Unix/Mac, delete the files with the following command:
```bash ```bash
rm -rf ~/.arthas/ $ rm -rf ~/.arthas/
``` ```
* On Windows, delete `.arthas` directory under user home. * On Windows, delete `.arthas` directory under user home.

@ -1,12 +1,12 @@
jad jad
=== ===
> De-compile the specified classes. > Decompile the specified classes.
`jad` helps to de-compile the byte code running in JVM to the source code to assist you to understand the logic behind better. `jad` helps to decompile the byte code running in JVM to the source code to assist you to understand the logic behind better.
* The de-compiled code is syntax highlighted for better readability in Arthas console. * The decompiled code is syntax highlighted for better readability in Arthas console.
* It is possible that there's grammar error in the de-compiled code, but it should not affect your interpretation. * It is possible that there's grammar error in the decompiled code, but it should not affect your interpretation.
### Options ### Options
@ -18,7 +18,66 @@ jad
### Usage ### Usage
> If the target class is loaded by multiple classloaders, `jad` outputs the `hashcode` of the corresponding classloaders, then you can re-run `jad` and specify `-c <hashcode>` to de-compile the target class from the specified classloader. #### Decompile `java.lang.String`
```java
$ jad java.lang.String
ClassLoader:
Location:
/*
* Decompiled with CFR 0_132.
*/
package java.lang;
import java.io.ObjectStreamField;
...
public final class String
implements Serializable,
Comparable<String>,
CharSequence {
private final char[] value;
private int hash;
private static final long serialVersionUID = -6849794470754667710L;
private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0];
public static final Comparator<String> CASE_INSENSITIVE_ORDER = new CaseInsensitiveComparator();
public String(byte[] arrby, int n, int n2) {
String.checkBounds(arrby, n, n2);
this.value = StringCoding.decode(arrby, n, n2);
}
...
```
#### Decompile the specified method
```java
$ jad demo.MathGame main
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
Location:
/private/tmp/arthas-demo.jar
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
do {
game.run();
TimeUnit.SECONDS.sleep(1L);
} while (true);
}
Affect(row-cnt:1) cost in 228 ms.
```
#### Decompile with specified classLoader
> If the target class is loaded by multiple classloaders, `jad` outputs the `hashcode` of the corresponding classloaders, then you can re-run `jad` and specify `-c <hashcode>` to decompile the target class from the specified classloader.
```java ```java
$ jad org.apache.log4j.Logger $ jad org.apache.log4j.Logger
@ -39,7 +98,7 @@ ClassLoader:
+-monitor's ModuleClassLoader +-monitor's ModuleClassLoader
Location: Location:
/Users/zhuyong/Downloads/taobao-hsf.sar/plugins/monitor/lib/log4j-1.2.14.jar /Users/admin/app/log4j-1.2.14.jar
package org.apache.log4j; package org.apache.log4j;
@ -54,102 +113,7 @@ public class Logger extends Category
super(name); super(name);
} }
public static Logger getLogger(String name) ...
{
return LogManager.getLogger(name);
}
public static Logger getLogger(Class clazz)
{
return LogManager.getLogger(clazz.getName());
}
public static Logger getRootLogger()
{
return LogManager.getRootLogger();
}
public static Logger getLogger(String name, LoggerFactory factory)
{
return LogManager.getLogger(name, factory);
}
public void trace(Object message)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, null);
}
}
public void trace(Object message, Throwable t)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, t);
}
}
public boolean isTraceEnabled()
{
if (repository.isDisabled(5000))
{
return false;
}
return Level.TRACE.isGreaterOrEqual(getEffectiveLevel());
}
static
{
Logger.FQCN = Logger.class.getName();
}
}
Affect(row-cnt:1) cost in 190 ms. Affect(row-cnt:1) cost in 190 ms.
``` ```
De-compile the specified method:
```bash
$ jad com.taobao.container.web.arthas.rest.MetricsController directMetrics
ClassLoader:
+-com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444
+-sun.misc.Launcher$AppClassLoader@14dad5dc
+-sun.misc.Launcher$ExtClassLoader@a38d7a3
Location:
/Users/zhuyong/middleware/tomcat-web/tomcat-web-web/target/classes/
private Map<String, Object> directMetrics(String ip, String[] metrics) {
JSONObject obj;
HashMap<String, Object> result = new HashMap<String, Object>();
result.put("success", false);
String metricUrl = "http://" + ip + ":8006/metrics/specific";
String postBody = Arrays.stream(metrics).map(metric -> "metric=" + metric).collect(Collectors.joining("&"));
HttpClientUtils.Response resp = HttpClientUtils.sendPostRequest((String)metricUrl, (String)postBody);
if (resp.isSuccess() && (obj = JSON.parseObject(resp.getContent())).containsKey("success") && obj.getBoolean("success").booleanValue() && obj.containsKey("data")) {
JSONArray dataArray = obj.getJSONArray("data");
HashMap<String, Object> metricMap = new HashMap<String, Object>();
for (Object aDataArray : dataArray) {
JSONObject o = (JSONObject)aDataArray;
metricMap.put(o.getString("metric"), o.get("value"));
}
result.put("data", metricMap);
result.put("success", true);
return result;
}
return result;
}
Affect(row-cnt:1) cost in 1508 ms.
```

@ -37,19 +37,31 @@ Parameter `[c:]` stands for cycles of statistics. Its value is an integer value
### Usage ### Usage
```shell ```bash
$ monitor -c 5 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute $ monitor -c 5 demo.MathGame primeFactors
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 36 ms. Affect(class-cnt:1 , method-cnt:1) cost in 94 ms.
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
2015-12-17 10:56:40 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute 10 10 0 2.00 0.00% 2018-12-03 19:06:38 demo.MathGame primeFactors 5 1 4 1.15 80.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
2015-12-17 10:56:45 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute 11 11 0 2.18 0.00% 2018-12-03 19:06:43 demo.MathGame primeFactors 5 3 2 42.29 40.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt(ms) fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
2015-12-17 10:56:50 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute 0 0 0 0.00 0.00% 2018-12-03 19:06:48 demo.MathGame primeFactors 5 3 2 67.92 40.00%
timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
2018-12-03 19:06:53 demo.MathGame primeFactors 5 2 3 0.25 60.00%
timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
2018-12-03 19:06:58 demo.MathGame primeFactors 1 1 0 0.45 0.00%
timestamp class method total success fail avg-rt(ms) fail-rate
-----------------------------------------------------------------------------------------------
2018-12-03 19:07:03 demo.MathGame primeFactors 2 2 0 3182.72 0.00%
``` ```

@ -4,8 +4,8 @@ Quick Start
## 1. Start Demo Application ## 1. Start Demo Application
```bash ```bash
wget https://alibaba.github.io/arthas/arthas-demo.jar $ wget https://alibaba.github.io/arthas/arthas-demo.jar
java -jar arthas-demo.jar $ java -jar arthas-demo.jar
``` ```
`arthas-demo` is a simple program that generates a random number every second, then find all prime factors of the number. `arthas-demo` is a simple program that generates a random number every second, then find all prime factors of the number.
@ -19,8 +19,8 @@ The source code of `arthas-demo`: [View](https://github.com/alibaba/arthas/blob/
Execute the following command in the command line: Execute the following command in the command line:
```bash ```bash
wget https://alibaba.github.io/arthas/arthas-boot.jar $ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
``` ```
* The user to run this command *MUST* have the same privilege as the owner of the target process, as a simple example you can try the following command if the target process is managed by user `admin`: `sudo su admin && java -jar arthas-boot.jar` or `sudo -u admin -EH java -jar arthas-boot.jar` * The user to run this command *MUST* have the same privilege as the owner of the target process, as a simple example you can try the following command if the target process is managed by user `admin`: `sudo su admin && java -jar arthas-boot.jar` or `sudo -u admin -EH java -jar arthas-boot.jar`
@ -94,11 +94,11 @@ java.home /Library/Java/JavaVir
e/jre e/jre
``` ```
## 4. Get the Main Class of the process with the sysenv command ## 4. Get the Main Class of the process with the thread command
``` ```
$ sysenv | grep MAIN $ thread -n -1 | grep 'main('
JAVA_MAIN_CLASS_71560 demo.MathGame at demo.MathGame.main(MathGame.java:17)
``` ```
## 5. Decompile Main Class with jad command ## 5. Decompile Main Class with jad command

@ -115,7 +115,7 @@ v2016-03-07
v2016-01-18 v2016-01-18
---- ----
* [improvement] optimise [`jad`](jad.md); dump memory byte array in real time; using `jd-core-java` to de-compile; line number presented; * [improvement] optimise [`jad`](jad.md); dump memory byte array in real time; using `jd-core-java` to decompile; line number presented;
* [bug] fix checking/re-producing issues when [`tt`](tt.md) is watching thread-context related methods invoking * [bug] fix checking/re-producing issues when [`tt`](tt.md) is watching thread-context related methods invoking
v2016-01-08 v2016-01-08

@ -21,14 +21,21 @@ sc
### Usage ### Usage
For example, use `sc -df class-name` to view class's static fields: * Wildcards match search
```shell ```bash
$ sc -df org.apache.commons.lang.StringUtils $ sc demo.*
demo.MathGame
Affect(row-cnt:1) cost in 55 ms.
```
* View class details
class-info org.apache.commons.lang.StringUtils ```bash
code-source /Users/zhuyong/middleware/citrus-sample/petstore/web/target/petstore/WEB-INF/lib/commons-lang-2.4.jar $ sc -d demo.MathGame
name org.apache.commons.lang.StringUtils class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false isInterface false
isAnnotation false isAnnotation false
isEnum false isEnum false
@ -38,27 +45,52 @@ $ sc -df org.apache.commons.lang.StringUtils
isMemberClass false isMemberClass false
isPrimitive false isPrimitive false
isSynthetic false isSynthetic false
simple-name StringUtils simple-name MathGame
modifier public modifier public
annotation annotation
interfaces interfaces
super-class +-java.lang.Object super-class +-java.lang.Object
class-loader +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-org.apache.catalina.loader.StandardClassLoader@1d44eef3 +-sun.misc.Launcher$ExtClassLoader@66350f69
+-sun.misc.Launcher$AppClassLoader@57a462c9 classLoaderHash 3d4eac69
+-sun.misc.Launcher$ExtClassLoader@6951a712
fields modifier final,public,static Affect(row-cnt:1) cost in 875 ms.
type java.lang.String ```
name EMPTY
value * View class fileds
modifier final,public,static ```bash
type int $ sc -d -f demo.MathGame
name INDEX_NOT_FOUND class-info demo.MathGame
value -1 code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface false
isAnnotation false
isEnum false
isAnonymousClass false
isArray false
isLocalClass false
isMemberClass false
isPrimitive false
isSynthetic false
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
classLoaderHash 3d4eac69
fields modifierprivate,static
type java.util.Random
name random
value java.util.Random@522b4
08a
modifier final,private,static modifierprivate
type int type int
name PAD_LIMIT name illegalArgumentCount
value 8192
Affect(row-cnt:1) cost in 19 ms.
``` ```

@ -17,75 +17,69 @@ sm
### Usage ### Usage
Show methods from `org.apache.catalina.connector.Connector`: View methods of `java.lang.String`:
```bash ```bash
$ sm org.apache.catalina.connector.Connector $ sm java.lang.String
org.apache.catalina.connector.Connector-><init> java.lang.String-><init>
org.apache.catalina.connector.Connector->setProperty java.lang.String->equals
org.apache.catalina.connector.Connector->getProperty java.lang.String->toString
org.apache.catalina.connector.Connector->toString java.lang.String->hashCode
org.apache.catalina.connector.Connector->resume java.lang.String->compareTo
org.apache.catalina.connector.Connector->getScheme java.lang.String->indexOf
org.apache.catalina.connector.Connector->getProtocol java.lang.String->valueOf
org.apache.catalina.connector.Connector->getPort java.lang.String->checkBounds
org.apache.catalina.connector.Connector->setService java.lang.String->length
org.apache.catalina.connector.Connector->setPort java.lang.String->isEmpty
org.apache.catalina.connector.Connector->getService java.lang.String->charAt
org.apache.catalina.connector.Connector->getAttribute java.lang.String->codePointAt
org.apache.catalina.connector.Connector->setAttribute java.lang.String->codePointBefore
org.apache.catalina.connector.Connector->getLocalPort java.lang.String->codePointCount
org.apache.catalina.connector.Connector->pause java.lang.String->offsetByCodePoints
org.apache.catalina.connector.Connector->setProtocol java.lang.String->getChars
org.apache.catalina.connector.Connector->initInternal java.lang.String->getBytes
org.apache.catalina.connector.Connector->setSecure java.lang.String->contentEquals
org.apache.catalina.connector.Connector->getSecure java.lang.String->nonSyncContentEquals
org.apache.catalina.connector.Connector->startInternal java.lang.String->equalsIgnoreCase
org.apache.catalina.connector.Connector->stopInternal java.lang.String->compareToIgnoreCase
org.apache.catalina.connector.Connector->setScheme java.lang.String->regionMatches
org.apache.catalina.connector.Connector->createRequest java.lang.String->startsWith
org.apache.catalina.connector.Connector->getDomainInternal java.lang.String->endsWith
org.apache.catalina.connector.Connector->getProtocolHandler java.lang.String->indexOfSupplementary
org.apache.catalina.connector.Connector->setURIEncoding java.lang.String->lastIndexOf
org.apache.catalina.connector.Connector->findSslHostConfigs java.lang.String->lastIndexOfSupplementary
org.apache.catalina.connector.Connector->destroyInternal java.lang.String->substring
org.apache.catalina.connector.Connector->getObjectNameKeyProperties java.lang.String->subSequence
org.apache.catalina.connector.Connector->getAllowTrace java.lang.String->concat
org.apache.catalina.connector.Connector->setAllowTrace java.lang.String->replace
org.apache.catalina.connector.Connector->getAsyncTimeout java.lang.String->matches
org.apache.catalina.connector.Connector->setAsyncTimeout java.lang.String->contains
org.apache.catalina.connector.Connector->getEnableLookups java.lang.String->replaceFirst
org.apache.catalina.connector.Connector->setEnableLookups java.lang.String->replaceAll
org.apache.catalina.connector.Connector->getMaxCookieCount java.lang.String->split
... java.lang.String->join
java.lang.String->toLowerCase
java.lang.String->toUpperCase
java.lang.String->trim
java.lang.String->toCharArray
java.lang.String->format
java.lang.String->copyValueOf
java.lang.String->intern
Affect(row-cnt:44) cost in 1342 ms.
``` ```
Show methods' details from `org.apache.catalina.connector.Connector`:
View method `java.lang.String#toString` details:
```bash ```bash
$ sm org.apache.catalina.connector.Connector -d $ sm -d java.lang.String toString
declaring-class org.apache.catalina.connector.Connector declaring-class java.lang.String
constructor-name <init> method-name toString
modifier public modifier public
annotation annotation
parameters parameters
return java.lang.String
exceptions exceptions
declaring-class org.apache.catalina.connector.Connector Affect(row-cnt:1) cost in 3 ms.
constructor-name <init>
modifier public
annotation
parameters java.lang.String
exceptions
declaring-class org.apache.catalina.connector.Connector
method-name setProperty
modifier public
annotation
parameters java.lang.String
java.lang.String
return boolean
exceptions
......
``` ```

@ -3,7 +3,7 @@ watch
Monitor methods in data aspect including `return values`, `exceptions` and `parameters`. Monitor methods in data aspect including `return values`, `exceptions` and `parameters`.
With the help of [OGNL](https://en.wikipedia.org/wiki/OGNL), you can easily check the details of variables when methods being invoked. With the help of [OGNL](https://commons.apache.org/proper/commons-ognl/index.html), you can easily check the details of variables when methods being invoked.
### Parameters & Options ### Parameters & Options
@ -37,264 +37,196 @@ Advanced:
### Usage ### Usage
A demo: Start `arthas-demo` in [Quick Start](quick-start.md).
```java
public void execute() {
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) {
list.addAll(list2);
return list.size();
}
```
#### Check the `out parameters` and `return value` #### Check the `out parameters` and `return value`
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 2 $ watch demo.MathGame primeFactors "{params,returnObj}" -x 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 44 ms. Affect(class-cnt:1 , method-cnt:1) cost in 44 ms.
@ArrayList[ ts=2018-12-03 19:16:51; [cost=1.280502ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=4], @Integer[535629513],
@ArrayList[isEmpty=false;size=2], ],
@ArrayList[
@Integer[3],
@Integer[19],
@Integer[191],
@Integer[49199],
], ],
@Integer[4],
] ]
``` ```
#### Check `in parameters` #### Check `in parameters`
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 2 -b $ watch demo.MathGame primeFactors "{params,returnObj}" -x 2 -b
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 48 ms. Affect(class-cnt:1 , method-cnt:1) cost in 50 ms.
@ArrayList[ ts=2018-12-03 19:23:23; [cost=0.0353ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=2], @Integer[-1077465243],
@ArrayList[isEmpty=false;size=2],
], ],
null, null,
] ]
``` ```
Compared to the previous *check*, there are two differences: Compared to the previous *check*:
1. size of `params[0]` is `2` instead of `4`;
2. `return value` is `null` since it's `-b`. * `return value` is `null` since it's `-b`.
#### Check *before* and *after* at the same time #### Check *before* and *after* at the same time
```shell
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 2 -b -s ```bash
$ watch demo.MathGame primeFactors "{params,target,returnObj}" -x 2 -b -s -n 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 59 ms. Affect(class-cnt:1 , method-cnt:1) cost in 46 ms.
@ArrayList[ ts=2018-12-03 19:29:54; [cost=0.01696ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=2], @Integer[1544665400],
@ArrayList[isEmpty=false;size=2], ],
@MathGame[
random=@Random[java.util.Random@522b408a],
illegalArgumentCount=@Integer[13038],
], ],
null, null,
] ]
@ArrayList[ ts=2018-12-03 19:29:54; [cost=4.277392ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[isEmpty=false;size=4], @Integer[1544665400],
@ArrayList[isEmpty=false;size=2], ],
@MathGame[
random=@Random[java.util.Random@522b408a],
illegalArgumentCount=@Integer[13038],
],
@ArrayList[
@Integer[2],
@Integer[2],
@Integer[2],
@Integer[5],
@Integer[5],
@Integer[73],
@Integer[241],
@Integer[439],
], ],
@Integer[4],
] ]
``` ```
F.Y.I F.Y.I
1. the first block of output is the *before watching* point;
2. the order of the output determined by the *watching* order itself (nothing to do with the order of the options `-b -s`). * `-n 2`: threshold of execution times is 2.
* the first block of output is the *before watching* point;
* *the order of the output determined by the *watching* order itself (nothing to do with the order of the options `-b -s`).
#### Use `-x` to check more details #### Use `-x` to check more details
```shell ```bash
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" -x 3 $ watch demo.MathGame primeFactors "{params,target}" -x 3
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 59 ms. Affect(class-cnt:1 , method-cnt:1) cost in 58 ms.
@ArrayList[ ts=2018-12-03 19:34:19; [cost=0.587833ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[ @Integer[47816758],
@String[a],
@String[b],
@String[c],
@String[d],
], ],
@ArrayList[ @MathGame[
@String[c], random=@Random[
serialVersionUID=@Long[3905348978240129619],
@String[d], seed=@AtomicLong[3133719055989],
multiplier=@Long[25214903917],
addend=@Long[11],
mask=@Long[281474976710655],
DOUBLE_UNIT=@Double[1.1102230246251565E-16],
BadBound=@String[bound must be positive],
BadRange=@String[bound must be greater than origin],
BadSize=@String[size must be non-negative],
seedUniquifier=@AtomicLong[-3282039941672302964],
nextNextGaussian=@Double[0.0],
haveNextNextGaussian=@Boolean[false],
serialPersistentFields=@ObjectStreamField[][isEmpty=false;size=3],
unsafe=@Unsafe[sun.misc.Unsafe@2eaa1027],
seedOffset=@Long[24],
], ],
illegalArgumentCount=@Integer[13159],
], ],
@Integer[4],
] ]
``` ```
* `-x`: Expand level of object (1 by default)
#### Use condition expressions to locate specific call #### Use condition expressions to locate specific call
```shell ```bash
$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd "{params, returnObj}" "params[0].equals('aaa')" -x 2 $ watch demo.MathGame primeFactors "{params[0],target}" "params[0]<0"
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 29 ms. Affect(class-cnt:1 , method-cnt:1) cost in 68 ms.
@ArrayList[ ts=2018-12-03 19:36:04; [cost=0.530255ms] result=@ArrayList[
@Object[][ @Integer[-18178089],
@String[aaa], @MathGame[demo.MathGame@41cf53f9],
@String[bbb],
],
@Integer[6],
] ]
``` ```
#### Check `exceptions` #### Check `exceptions`
```shell ```bash
$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd "{params, throwExp}" -e -x 2 $ watch demo.MathGame primeFactors "{params[0],throwExp}" -e -x 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 29 ms. Affect(class-cnt:1 , method-cnt:1) cost in 62 ms.
@ArrayList[ ts=2018-12-03 19:38:00; [cost=1.414993ms] result=@ArrayList[
@Object[][ @Integer[-1120397038],
@String[aaa], java.lang.IllegalArgumentException: number is: -1120397038, need >= 2
@String[bbb], at demo.MathGame.primeFactors(MathGame.java:46)
], at demo.MathGame.run(MathGame.java:24)
at demo.MathGame.main(MathGame.java:16)
java.lang.NullPointerException ,
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.testAdd(UserManagerImpl.java:75)
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.register(UserManagerImpl.java:60)
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction.doRegister(RegisterAction.java:45)
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction$$FastClassByCGLIB$$ad5428f1.invoke(<generated>)
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.AbstractModuleEventAdapter.executeAndReturn(AbstractModuleEventAdapter.java:100)
at com.alibaba.citrus.service.moduleloader.impl.adapter.AbstractModuleEventAdapter.execute(AbstractModuleEventAdapter.java:58)
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke(PerformActionValve.java:63)
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)
at com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.doFilter(WebxFrameworkFilter.java:152)
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter(FilterBean.java:148)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.alibaba.citrus.webx.servlet.SetLoggingContextFilter.doFilter(SetLoggingContextFilter.java:61)
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter(FilterBean.java:148)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:152)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1760)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1719)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745),
] ]
``` ```
#### Filter based on time cost * `-e`: Trigger when an exception is thrown
* `throwExp`: the exception object
```shell #### Filter by time cost
$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add "{params,returnObj}" #cost>200 -x 3
```bash
$ watch demo.MathGame primeFactors '{params, returnObj}' '#cost>200' -x 2
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 59 ms. Affect(class-cnt:1 , method-cnt:1) cost in 66 ms.
@ArrayList[ ts=2018-12-03 19:40:28; [cost=2112.168897ms] result=@ArrayList[
@Object[][ @Object[][
@ArrayList[ @Integer[2141897465],
@String[a],
@String[b],
@String[c],
@String[d],
], ],
@ArrayList[ @ArrayList[
@String[c], @Integer[5],
@Integer[428379493],
@String[d],
],
], ],
@Integer[4],
] ]
``` ```
F.Y.I * `#cost>200` (`ms`) filter out all invokings that take less than `200ms`.
`#cost>200` (`ms`) filter out all invokings that take less than `200ms`.
#### Check the global properties of the target object #### Check the field of the target object
`target` stands for the current object. * `target` is the `this` object in java.
``` ```bash
$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps 'target' $ watch demo.MathGame primeFactors 'target'
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 128 ms. Affect(class-cnt:1 , method-cnt:1) cost in 52 ms.
ts=2017-10-31 18:45:55;result=@MyAppsController[ ts=2018-12-03 19:41:52; [cost=0.477882ms] result=@MathGame[
myFavAppsMapper=@$Proxy131[org.apache.ibatis.binding.MapperProxy@563e97f3], random=@Random[java.util.Random@522b408a],
getAppNameAndIdByEmpId=@$Proxy135[HardCodedTarget(type=GetAppNameAndIdByEmpId, url=http://hello.com)], illegalArgumentCount=@Integer[13355],
enableWebConsoleAppsMapper=@$Proxy132[org.apache.ibatis.binding.MapperProxy@7d51e4a8],
] ]
``` ```
`target.field_name` stands for a global property of the current object. * `target.field_name`: the field of the current object.
``` ```
$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps 'target.myFavAppsMapper' $ watch demo.MathGame primeFactors 'target.illegalArgumentCount'
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 126 ms. Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2017-10-31 18:46:17;result=@$Proxy131[ ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
m1=@Method[public boolean java.lang.Object.equals(java.lang.Object)], ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
m2=@Method[public java.lang.String java.lang.Object.toString()],
m5=@Method[public abstract java.util.List com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.listFavApps(java.util.Map)],
m3=@Method[public abstract int com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.delete(java.lang.String,java.lang.String,java.lang.String)],
m4=@Method[public abstract long com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.insert(com.taobao.container.dal.arthas.domain.MyFavAppsDO)],
m0=@Method[public native int java.lang.Object.hashCode()],
]
``` ```

@ -218,7 +218,7 @@
<li><a class="reference internal" href="sm.html"><span class="doc">sm</span></a> - check methods info for the loaded classes</li> <li><a class="reference internal" href="sm.html"><span class="doc">sm</span></a> - check methods info for the loaded classes</li>
<li><a class="reference internal" href="dump.html"><span class="doc">dump</span></a> - dump the loaded classes in byte code to the specified location</li> <li><a class="reference internal" href="dump.html"><span class="doc">dump</span></a> - dump the loaded classes in byte code to the specified location</li>
<li><a class="reference internal" href="redefine.html"><span class="doc">redefine</span></a> - load external <code class="docutils literal notranslate"><span class="pre">*.class</span></code> files and re-define it into JVM</li> <li><a class="reference internal" href="redefine.html"><span class="doc">redefine</span></a> - load external <code class="docutils literal notranslate"><span class="pre">*.class</span></code> files and re-define it into JVM</li>
<li><a class="reference internal" href="jad.html"><span class="doc">jad</span></a> - de-compile the specified loaded classes</li> <li><a class="reference internal" href="jad.html"><span class="doc">jad</span></a> - decompile the specified loaded classes</li>
<li><a class="reference internal" href="classloader.html"><span class="doc">classloader</span></a> - check the inheritance structure, urls, class loading info for the specified class; using classloader to get the url of the resource e.g. <code class="docutils literal notranslate"><span class="pre">java/lang/String.class</span></code></li> <li><a class="reference internal" href="classloader.html"><span class="doc">classloader</span></a> - check the inheritance structure, urls, class loading info for the specified class; using classloader to get the url of the resource e.g. <code class="docutils literal notranslate"><span class="pre">java/lang/String.class</span></code></li>
</ul> </ul>
</div> </div>

@ -106,7 +106,15 @@
<li class="toctree-l2"><a class="reference internal" href="jad.html">jad</a></li> <li class="toctree-l2"><a class="reference internal" href="jad.html">jad</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">classloader</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">classloader</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#options">Options</a></li> <li class="toctree-l3"><a class="reference internal" href="#options">Options</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="#view-statistics-categorized-by-class-type">View statistics categorized by class type</a></li>
<li class="toctree-l4"><a class="reference internal" href="#view-statistics-categorized-by-loaded-classes-number">View statistics categorized by loaded classes number</a></li>
<li class="toctree-l4"><a class="reference internal" href="#view-class-loaders-hierarchy">View class-loaders hierarchy</a></li>
<li class="toctree-l4"><a class="reference internal" href="#show-the-urls-of-the-urlclassloader">Show the URLs of the URLClassLoader</a></li>
<li class="toctree-l4"><a class="reference internal" href="#use-the-classloader-to-load-resource">Use the classloader to load resource</a></li>
<li class="toctree-l4"><a class="reference internal" href="#use-the-classloader-to-load-class">Use the classloader to load class</a></li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="redefine.html">redefine</a></li> <li class="toctree-l2"><a class="reference internal" href="redefine.html">redefine</a></li>
@ -223,125 +231,105 @@
<td align="left">print classloader's hashcode</td> <td align="left">print classloader's hashcode</td>
</tr> </tr>
<tr> <tr>
<td align="right">[c: r:]</td> <td align="right"><code>[c: r:]</code></td>
<td align="left">using class loader to search resource</td> <td align="left">using ClassLoader to search resource</td>
</tr>
<tr>
<td align="right"><code>[c: load:]</code></td>
<td align="left">using ClassLoader to load class</td>
</tr> </tr>
</tbody> </tbody>
</table></div> </table></div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<ul class="simple"> <div class="section" id="view-statistics-categorized-by-class-type">
<li>View statistics categorized by class type</li> <span id="view-statistics-categorized-by-class-type"></span><h3>View statistics categorized by class type<a class="headerlink" href="#view-statistics-categorized-by-class-type" title="Permalink to this headline"></a></h3>
</ul>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader
name numberOfInstances loadedCountTotal name numberOfInstances loadedCountTotal
com.taobao.pandora.service.loader.ModuleClassLoader <span class="m">29</span> <span class="m">11659</span> com.taobao.arthas.agent.ArthasClassloader <span class="m">1</span> <span class="m">2115</span>
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader <span class="m">1</span> <span class="m">5308</span> BootstrapClassLoader <span class="m">1</span> <span class="m">1861</span>
BootstrapClassLoader <span class="m">1</span> <span class="m">3711</span> sun.reflect.DelegatingClassLoader <span class="m">5</span> <span class="m">5</span>
com.taobao.arthas.agent.ArthasClassloader <span class="m">2</span> <span class="m">2825</span> sun.misc.Launcher<span class="nv">$AppClassLoader</span> <span class="m">1</span> <span class="m">4</span>
sun.reflect.DelegatingClassLoader <span class="m">332</span> <span class="m">332</span> sun.misc.Launcher<span class="nv">$ExtClassLoader</span> <span class="m">1</span> <span class="m">1</span>
java.net.URLClassLoader <span class="m">1</span> <span class="m">285</span> Affect<span class="o">(</span>row-cnt:5<span class="o">)</span> cost in <span class="m">3</span> ms.
sun.misc.Launcher<span class="nv">$AppClassLoader</span> <span class="m">1</span> <span class="m">77</span>
sun.misc.Launcher<span class="nv">$ExtClassLoader</span> <span class="m">1</span> <span class="m">46</span>
com.alibaba.fastjson.util.ASMClassLoader <span class="m">2</span> <span class="m">3</span>
org.jvnet.hk2.internal.DelegatingClassLoader <span class="m">2</span> <span class="m">2</span>
sun.reflect.misc.MethodUtil <span class="m">1</span> <span class="m">1</span>
Affect<span class="o">(</span>row-cnt:11<span class="o">)</span> cost in <span class="m">66</span> ms.
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>View statistics categorized by loaded classes number</li> <div class="section" id="view-statistics-categorized-by-loaded-classes-number">
</ul> <span id="view-statistics-categorized-by-loaded-classes-number"></span><h3>View statistics categorized by loaded classes number<a class="headerlink" href="#view-statistics-categorized-by-loaded-classes-number" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -l <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -l
name loadedCount hash parent name loadedCount <span class="nb">hash</span> parent
BootstrapClassLoader 3711 null null BootstrapClassLoader <span class="m">1861</span> null null
com.alibaba.fastjson.util.ASMClassLoader@3bbaa1b8 2 3bbaa1b8 monitor&#39;s ModuleClassLoader com.taobao.arthas.agent.ArthasClassloader@68b31f0a <span class="m">2115</span> 68b31f0a sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
com.alibaba.fastjson.util.ASMClassLoader@5e255d0b 1 5e255d0b eagleeye-core&#39;s ModuleClassLoader sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69 <span class="m">4</span> 3d4eac69 sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
com.taobao.arthas.agent.ArthasClassloader@4fa2d7e6 1795 4fa2d7e6 sun.misc.Launcher$ExtClassLoader@a38d7a3 sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69 <span class="m">1</span> 66350f69 null
com.taobao.arthas.agent.ArthasClassloader@522400c2 1033 522400c2 sun.misc.Launcher$ExtClassLoader@a38d7a3 Affect<span class="o">(</span>row-cnt:4<span class="o">)</span> cost in <span class="m">2</span> ms.
com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444 5308 1817d444 sun.misc.Launcher$AppClassLoader@14dad5dc
tbsession&#39;s ModuleClassLoader 285 609cd4d8 null
pandora-qos-service&#39;s ModuleClassLoader 267 2f8dad04 null
pandora-framework&#39;s ModuleClassLoader 78 4009e306 null
filesync-client&#39;s ModuleClassLoader 4 4b8ee4de null
rocketmq-client&#39;s ModuleClassLoader 431 247bddad null
eagleeye-core&#39;s ModuleClassLoader 451 1ba9117e null
alimonitor-jmonitor&#39;s ModuleClassLoader 134 22fcf7ab null
metaq-client&#39;s ModuleClassLoader 35 41a2befb null
hsf-mock&#39;s ModuleClassLoader 3 2002fc1d null
monitor&#39;s ModuleClassLoader 1427 131ef10 null
spas-sdk-service&#39;s ModuleClassLoader 7 10d307f1 null
vipserver-client&#39;s ModuleClassLoader 137 7a419da4 null
metrics&#39;s ModuleClassLoader 146 696da30b null
mtop-uncenter&#39;s ModuleClassLoader 922 79d8407f null
spas-sdk-client&#39;s ModuleClassLoader 235 4944252c null
live-profiler-pandora&#39;s ModuleClassLoader 1 6913c1fb null
notify-tr-client&#39;s ModuleClassLoader 472 fba92d3 null
ons-sdk&#39;s ModuleClassLoader 70 23348b5d null
tair-plugin&#39;s ModuleClassLoader 1053 7c9d8e2 null
tddl-client&#39;s ModuleClassLoader 2354 4988d8b8 null
config-client&#39;s ModuleClassLoader 93 429bffaa null
diamond-client&#39;s ModuleClassLoader 360 3d5c822d null
pandolet&#39;s ModuleClassLoader 99 41e1e210 null
hsf&#39;s ModuleClassLoader 1796 3232a28a null
acl.plugin&#39;s ModuleClassLoader 379 67080771 null
buc.sso.client.plugin&#39;s ModuleClassLoader 195 13b6aecc null
unitrouter&#39;s ModuleClassLoader 64 7e5afaa6 null
switch&#39;s ModuleClassLoader 104 24313fcc null
hsf-notify-client&#39;s ModuleClassLoader 57 4d0f2471 null
java.net.URLClassLoader@7ec7ffd3 285 7ec7ffd3 sun.misc.Launcher$ExtClassLoader@a38d7a3
javax.management.remote.rmi.NoCallStackClassLoader@53f65459 1 53f65459 null
javax.management.remote.rmi.NoCallStackClassLoader@2833cc44 1 2833cc44 null
org.jvnet.hk2.internal.DelegatingClassLoader@72cda8ee 1 72cda8ee monitor&#39;s ModuleClassLoader
org.jvnet.hk2.internal.DelegatingClassLoader@1f57f96d 1 1f57f96d monitor&#39;s ModuleClassLoader
sun.misc.Launcher$AppClassLoader@14dad5dc 77 14dad5dc sun.misc.Launcher$ExtClassLoader@a38d7a3
sun.misc.Launcher$ExtClassLoader@a38d7a3 46 a38d7a3 null
sun.reflect.misc.MethodUtil@1201f221 1 1201f221 sun.misc.Launcher$AppClassLoader@14dad5dc
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>View class-loaders hierarchy</li> <div class="section" id="view-class-loaders-hierarchy">
</ul> <span id="view-class-loaders-hierarchy"></span><h3>View class-loaders hierarchy<a class="headerlink" href="#view-class-loaders-hierarchy" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -t <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -t
+-BootstrapClassLoader +-BootstrapClassLoader
+-unitrouter<span class="s1">&#39;s ModuleClassLoader</span> +-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
<span class="s1">+-diamond-client&#39;</span>s ModuleClassLoader +-com.taobao.arthas.agent.ArthasClassloader@68b31f0a
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@548a102f +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
<span class="p">|</span> +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@14dad5dc Affect<span class="o">(</span>row-cnt:4<span class="o">)</span> cost in <span class="m">3</span> ms.
<span class="p">|</span> +-com.taobao.arthas.agent.AgentLauncher<span class="nv">$1</span>@334e6bb8
<span class="p">|</span> <span class="p">|</span> +-sun.reflect.DelegatingClassLoader@328b3a05
<span class="p">|</span> <span class="p">|</span> +-sun.reflect.DelegatingClassLoader@73f44f24
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>Show the URLs from which to load classes and resources for one particular URLClassLoader</li> <div class="section" id="show-the-urls-of-the-urlclassloader">
</ul> <span id="show-the-urls-of-the-urlclassloader"></span><h3>Show the URLs of the URLClassLoader<a class="headerlink" href="#show-the-urls-of-the-urlclassloader" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 5ffe9775 <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 3d4eac69
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/commons-lang-2.6.jar file:/private/tmp/arthas-demo.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/log4j-1.2.16.jar file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/logger.api-0.1.4.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.api-2.0.7-SNAPSHOT.jar Affect<span class="o">(</span>row-cnt:9<span class="o">)</span> cost in <span class="m">3</span> ms.
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.container-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/pandora.thirdcontainer-2.0.7-SNAPSHOT.jar
file:/Users/hello/soft/taobao-tomcat-7.0.64/deploy/taobao-hsf.sar/lib/picocontainer-2.14.3.jar
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> </div>
<li>Use one class loader to search one particular resource</li> <div class="section" id="use-the-classloader-to-load-resource">
</ul> <span id="use-the-classloader-to-load-resource"></span><h3>Use the classloader to load resource<a class="headerlink" href="#use-the-classloader-to-load-resource" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 226b143b -r META-INF/MANIFEST.MF <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 3d4eac69 -r META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/enterprise/cdi-api/1.0/cdi-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/System/Library/Java/Extensions/MRJToolkit.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hello/.m2/repository/javax/annotation/jsr250-api/1.0/jsr250-api-1.0.jar!/META-INF/MANIFEST.MF jar:file:/private/tmp/arthas-demo.jar!/META-INF/MANIFEST.MF
jar:file:/Users/hengyunabc/.arthas/lib/3.0.5/arthas/arthas-agent.jar!/META-INF/MANIFEST.MF
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> <p>Use the classloader to load <code class="docutils literal notranslate"><span class="pre">.class</span></code> resource</p>
<li>Use one class loader to search one particular class</li>
</ul>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 1b6d3586 -r java/lang/String.class <div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ classloader -c 1b6d3586 -r java/lang/String.class
jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class jar:file:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/lib/rt.jar!/java/lang/String.class
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="use-the-classloader-to-load-class">
<span id="use-the-classloader-to-load-class"></span><h3>Use the classloader to load class<a class="headerlink" href="#use-the-classloader-to-load-class" title="Permalink to this headline"></a></h3>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ classloader -c 3d4eac69 --load demo.MathGame
load class success.
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface <span class="nb">false</span>
isAnnotation <span class="nb">false</span>
isEnum <span class="nb">false</span>
isAnonymousClass <span class="nb">false</span>
isArray <span class="nb">false</span>
isLocalClass <span class="nb">false</span>
isMemberClass <span class="nb">false</span>
isPrimitive <span class="nb">false</span>
isSynthetic <span class="nb">false</span>
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
classLoaderHash 3d4eac69
</pre></div>
</div>
</div>
</div>
</div> </div>

@ -222,29 +222,17 @@
</table></div> </table></div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ dump org.apache.commons.lang.StringUtils <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ dump java.lang.String
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
29505d69 +-tddl-client<span class="s1">&#39;s ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora</span> null /Users/admin/logs/arthas/classdump/java/lang/String.class
<span class="s1"> .service.loader.ModuleClassLoader-29505d69/org.apache.commons.lang.StringUtils.class</span> Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">119</span> ms.
<span class="s1"> 6e51ad67 +-java.net.URLClassLoader@6e51ad67 /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL</span> </pre></div>
<span class="s1"> +-sun.misc.Launcher$AppClassLoader@6951a712 oader-6e51ad67/org.apache.commons.lang.StringUtils.class</span> </div>
<span class="s1"> +-sun.misc.Launcher$ExtClassLoader@6fafc4c2</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ dump demo.*
<span class="s1"> 2bdd9114 +-pandora-qos-service&#39;</span>s ModuleClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.pandora
.service.loader.ModuleClassLoader-2bdd9114/org.apache.commons.lang.StringUtils.class
544dc9ba +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/com.taobao.tomcat.
+-org.apache.catalina.loader.StandardClassLoader@2302e984 container.context.loader.AliWebappClassLoader-544dc9ba/org.apache.commons.lang.String
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@6951a712 Utils.class
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6fafc4c2
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassL
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@6951a712 oader-22880c2b/org.apache.commons.lang.StringUtils.class
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6fafc4c2
Affect<span class="o">(</span>row-cnt:5<span class="o">)</span> cost in <span class="m">156</span> ms.
$ dump -E org<span class="se">\.</span>apache<span class="se">\.</span>commons<span class="se">\.</span>lang<span class="se">\.</span>StringUtils -c 22880c2b
HASHCODE CLASSLOADER LOCATION HASHCODE CLASSLOADER LOCATION
22880c2b +-java.net.URLClassLoader@22880c2b /Users/zhuyong/middleware/taobao-tomcat/output/build/bin/classdump/java.net.URLClassLoader-22880c2b/org 3d4eac69 +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69 /Users/admin/logs/arthas/classdump/sun.misc.Launcher<span class="nv">$AppClassLoader</span>-3d4eac69/demo/MathGame.class
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@6951a712 .apache.commons.lang.StringUtils.class +-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6fafc4c2 Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">39</span> ms.
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">67</span> ms.
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -98,7 +98,11 @@
<li class="toctree-l2"><a class="reference internal" href="jvm.html">jvm</a></li> <li class="toctree-l2"><a class="reference internal" href="jvm.html">jvm</a></li>
<li class="toctree-l2"><a class="reference internal" href="sysprop.html">sysprop</a></li> <li class="toctree-l2"><a class="reference internal" href="sysprop.html">sysprop</a></li>
<li class="toctree-l2"><a class="reference internal" href="sysenv.html">sysenv</a></li> <li class="toctree-l2"><a class="reference internal" href="sysenv.html">sysenv</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">getstatic</a></li> <li class="toctree-l2 current"><a class="current reference internal" href="#">getstatic</a><ul>
<li class="toctree-l3"><a class="reference external" href="https://commons.apache.org/proper/commons-ognl/language-guide.html">OGNL official guide</a></li>
<li class="toctree-l3"><a class="reference external" href="https://github.com/alibaba/arthas/issues/71">Special usages</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="ognl.html">ognl</a></li> <li class="toctree-l2"><a class="reference internal" href="ognl.html">ognl</a></li>
<li class="toctree-l2"><a class="reference internal" href="sc.html">sc</a></li> <li class="toctree-l2"><a class="reference internal" href="sc.html">sc</a></li>
<li class="toctree-l2"><a class="reference internal" href="sm.html">sm</a></li> <li class="toctree-l2"><a class="reference internal" href="sm.html">sm</a></li>
@ -190,8 +194,38 @@
<div class="section" id="getstatic"> <div class="section" id="getstatic">
<span id="getstatic"></span><h1>getstatic<a class="headerlink" href="#getstatic" title="Permalink to this headline"></a></h1> <span id="getstatic"></span><h1>getstatic<a class="headerlink" href="#getstatic" title="Permalink to this headline"></a></h1>
<ul class="simple">
<li>It is recommended to use the [OGNL] (ognl.md) command, which will be more flexibility.</li>
</ul>
<p>Check the static fields of classes conveniently, the usage is <code class="docutils literal notranslate"><span class="pre">getstatic</span> <span class="pre">class_name</span> <span class="pre">field_name</span></code>.</p> <p>Check the static fields of classes conveniently, the usage is <code class="docutils literal notranslate"><span class="pre">getstatic</span> <span class="pre">class_name</span> <span class="pre">field_name</span></code>.</p>
<p>Tip: if the static field is a complex class, you can even use <a class="reference external" href="https://en.wikipedia.org/wiki/OGNL"><code class="docutils literal notranslate"><span class="pre">OGNL</span></code></a> to traverse, filter and access the inner properties of this class.</p> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ getstatic demo.MathGame random
field: random
@Random<span class="o">[</span>
<span class="nv">serialVersionUID</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">3905348978240129619</span><span class="o">]</span>,
<span class="nv">seed</span><span class="o">=</span>@AtomicLong<span class="o">[</span><span class="m">120955813885284</span><span class="o">]</span>,
<span class="nv">multiplier</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">25214903917</span><span class="o">]</span>,
<span class="nv">addend</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">11</span><span class="o">]</span>,
<span class="nv">mask</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">281474976710655</span><span class="o">]</span>,
<span class="nv">DOUBLE_UNIT</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">1</span>.1102230246251565E-16<span class="o">]</span>,
<span class="nv">BadBound</span><span class="o">=</span>@String<span class="o">[</span>bound must be positive<span class="o">]</span>,
<span class="nv">BadRange</span><span class="o">=</span>@String<span class="o">[</span>bound must be greater than origin<span class="o">]</span>,
<span class="nv">BadSize</span><span class="o">=</span>@String<span class="o">[</span>size must be non-negative<span class="o">]</span>,
<span class="nv">seedUniquifier</span><span class="o">=</span>@AtomicLong<span class="o">[</span>-3282039941672302964<span class="o">]</span>,
<span class="nv">nextNextGaussian</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">0</span>.0<span class="o">]</span>,
<span class="nv">haveNextNextGaussian</span><span class="o">=</span>@Boolean<span class="o">[</span>false<span class="o">]</span>,
<span class="nv">serialPersistentFields</span><span class="o">=</span>@ObjectStreamField<span class="o">[][</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">3</span><span class="o">]</span>,
<span class="nv">unsafe</span><span class="o">=</span>@Unsafe<span class="o">[</span>sun.misc.Unsafe@2eaa1027<span class="o">]</span>,
<span class="nv">seedOffset</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">24</span><span class="o">]</span>,
<span class="o">]</span>
</pre></div>
</div>
<p>Tip: if the static field is a complex class, you can even use <a class="reference external" href="https://commons.apache.org/proper/commons-ognl/language-guide.html"><code class="docutils literal notranslate"><span class="pre">OGNL</span></code></a> to traverse, filter and access the inner properties of this class.</p>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference external" href="https://commons.apache.org/proper/commons-ognl/language-guide.html">OGNL official guide</a></li>
<li class="toctree-l1"><a class="reference external" href="https://github.com/alibaba/arthas/issues/71">Special usages</a></li>
</ul>
</div>
<p>E.g. suppose <code class="docutils literal notranslate"><span class="pre">n</span></code> is a <code class="docutils literal notranslate"><span class="pre">Map</span></code> and its key is a <code class="docutils literal notranslate"><span class="pre">Enum</span></code>, then you can achieve this if you want to pick the key with a specific <code class="docutils literal notranslate"><span class="pre">Enum</span></code> value:</p> <p>E.g. suppose <code class="docutils literal notranslate"><span class="pre">n</span></code> is a <code class="docutils literal notranslate"><span class="pre">Map</span></code> and its key is a <code class="docutils literal notranslate"><span class="pre">Enum</span></code>, then you can achieve this if you want to pick the key with a specific <code class="docutils literal notranslate"><span class="pre">Enum</span></code> value:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ getstatic com.alibaba.arthas.Test n <span class="s1">&#39;entrySet().iterator.{? #this.key.name()==&quot;STOP&quot;}&#39;</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ getstatic com.alibaba.arthas.Test n <span class="s1">&#39;entrySet().iterator.{? #this.key.name()==&quot;STOP&quot;}&#39;</span>
field: n field: n

@ -91,7 +91,7 @@
<ul class="current"> <ul class="current">
<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a><ul> <li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#quick-installation">Quick installation</a><ul> <li class="toctree-l2"><a class="reference internal" href="#quick-installation">Quick installation</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#use-arthas-boot">Use <code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code></a></li> <li class="toctree-l3"><a class="reference internal" href="#use-arthas-boot-recommend">Use <code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code>(Recommend)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#use-as-sh">Use <code class="docutils literal notranslate"><span class="pre">as.sh</span></code></a></li> <li class="toctree-l3"><a class="reference internal" href="#use-as-sh">Use <code class="docutils literal notranslate"><span class="pre">as.sh</span></code></a></li>
</ul> </ul>
</li> </li>
@ -179,22 +179,22 @@
<span id="install-arthas"></span><h1>Install Arthas<a class="headerlink" href="#install-arthas" title="Permalink to this headline"></a></h1> <span id="install-arthas"></span><h1>Install Arthas<a class="headerlink" href="#install-arthas" title="Permalink to this headline"></a></h1>
<div class="section" id="quick-installation"> <div class="section" id="quick-installation">
<span id="quick-installation"></span><h2>Quick installation<a class="headerlink" href="#quick-installation" title="Permalink to this headline"></a></h2> <span id="quick-installation"></span><h2>Quick installation<a class="headerlink" href="#quick-installation" title="Permalink to this headline"></a></h2>
<div class="section" id="use-arthas-boot"> <div class="section" id="use-arthas-boot-recommend">
<span id="use-arthas-boot"></span><h3>Use <code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code><a class="headerlink" href="#use-arthas-boot" title="Permalink to this headline"></a></h3> <span id="use-arthas-boot-recommend"></span><h3>Use <code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code>(Recommend)<a class="headerlink" href="#use-arthas-boot-recommend" title="Permalink to this headline"></a></h3>
<p>Download<code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code>Start with <code class="docutils literal notranslate"><span class="pre">java</span></code> command:</p> <p>Download<code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code>Start with <code class="docutils literal notranslate"><span class="pre">java</span></code> command:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>wget https://alibaba.github.io/arthas/arthas-boot.jar <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
</pre></div> </pre></div>
</div> </div>
<p>Print usage:</p> <p>Print usage:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>java -jar arthas-boot.jar -h <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ java -jar arthas-boot.jar -h
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="use-as-sh"> <div class="section" id="use-as-sh">
<span id="use-as-sh"></span><h3>Use <code class="docutils literal notranslate"><span class="pre">as.sh</span></code><a class="headerlink" href="#use-as-sh" title="Permalink to this headline"></a></h3> <span id="use-as-sh"></span><h3>Use <code class="docutils literal notranslate"><span class="pre">as.sh</span></code><a class="headerlink" href="#use-as-sh" title="Permalink to this headline"></a></h3>
<p>You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press <em>Enter</em> to run:</p> <p>You can install Arthas with one single line command on Linux, Unix, and Mac. Pls. copy the following command and paste it into the command line, then press <em>Enter</em> to run:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>curl -L https://alibaba.github.io/arthas/install.sh <span class="p">|</span> sh <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ curl -L https://alibaba.github.io/arthas/install.sh <span class="p">|</span> sh
</pre></div> </pre></div>
</div> </div>
<p>The command above will download the bootstrap script <code class="docutils literal notranslate"><span class="pre">as.sh</span></code> to the current directory. You can move it the any other place you want, or put its location in <code class="docutils literal notranslate"><span class="pre">$PATH</span></code>.</p> <p>The command above will download the bootstrap script <code class="docutils literal notranslate"><span class="pre">as.sh</span></code> to the current directory. You can move it the any other place you want, or put its location in <code class="docutils literal notranslate"><span class="pre">$PATH</span></code>.</p>
@ -205,11 +205,11 @@ java -jar arthas-boot.jar
<span id="full-installation"></span><h2>Full installation<a class="headerlink" href="#full-installation" title="Permalink to this headline"></a></h2> <span id="full-installation"></span><h2>Full installation<a class="headerlink" href="#full-installation" title="Permalink to this headline"></a></h2>
<p>Latest Version, Click To Download: <a class="reference external" href="http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;g=com.taobao.arthas&amp;a=arthas-packaging&amp;e=zip&amp;c=bin&amp;v=LATEST"><img alt="Arthas" src="https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square" /></a></p> <p>Latest Version, Click To Download: <a class="reference external" href="http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;g=com.taobao.arthas&amp;a=arthas-packaging&amp;e=zip&amp;c=bin&amp;v=LATEST"><img alt="Arthas" src="https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square" /></a></p>
<p>Download and unzip, find <code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code> in the directory. Start with <code class="docutils literal notranslate"><span class="pre">java</span></code> command:</p> <p>Download and unzip, find <code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code> in the directory. Start with <code class="docutils literal notranslate"><span class="pre">java</span></code> command:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>java -jar arthas-boot.jar <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ java -jar arthas-boot.jar
</pre></div> </pre></div>
</div> </div>
<p>Print usage:</p> <p>Print usage:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>java -jar arthas-boot.jar -h <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ java -jar arthas-boot.jar -h
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -225,7 +225,7 @@ java -jar arthas-boot.jar
<span id="uninstall"></span><h2>Uninstall<a class="headerlink" href="#uninstall" title="Permalink to this headline"></a></h2> <span id="uninstall"></span><h2>Uninstall<a class="headerlink" href="#uninstall" title="Permalink to this headline"></a></h2>
<ul> <ul>
<li><p class="first">On Linux/Unix/Mac, delete the files with the following command:</p> <li><p class="first">On Linux/Unix/Mac, delete the files with the following command:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>rm -rf ~/.arthas/ <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ rm -rf ~/.arthas/
</pre></div> </pre></div>
</div> </div>
</li> </li>

@ -105,7 +105,12 @@
<li class="toctree-l2"><a class="reference internal" href="dump.html">dump</a></li> <li class="toctree-l2"><a class="reference internal" href="dump.html">dump</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">jad</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">jad</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#options">Options</a></li> <li class="toctree-l3"><a class="reference internal" href="#options">Options</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="#decompile-java-lang-string">Decompile <code class="docutils literal notranslate"><span class="pre">java.lang.String</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#decompile-the-specified-method">Decompile the specified method</a></li>
<li class="toctree-l4"><a class="reference internal" href="#decompile-with-specified-classloader">Decompile with specified classLoader</a></li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="classloader.html">classloader</a></li> <li class="toctree-l2"><a class="reference internal" href="classloader.html">classloader</a></li>
@ -195,11 +200,11 @@
<div class="section" id="jad"> <div class="section" id="jad">
<span id="jad"></span><h1>jad<a class="headerlink" href="#jad" title="Permalink to this headline"></a></h1> <span id="jad"></span><h1>jad<a class="headerlink" href="#jad" title="Permalink to this headline"></a></h1>
<blockquote> <blockquote>
<div>De-compile the specified classes.</div></blockquote> <div>Decompile the specified classes.</div></blockquote>
<p><code class="docutils literal notranslate"><span class="pre">jad</span></code> helps to de-compile the byte code running in JVM to the source code to assist you to understand the logic behind better.</p> <p><code class="docutils literal notranslate"><span class="pre">jad</span></code> helps to decompile the byte code running in JVM to the source code to assist you to understand the logic behind better.</p>
<ul class="simple"> <ul class="simple">
<li>The de-compiled code is syntax highlighted for better readability in Arthas console.</li> <li>The decompiled code is syntax highlighted for better readability in Arthas console.</li>
<li>It is possible that theres grammar error in the de-compiled code, but it should not affect your interpretation.</li> <li>It is possible that theres grammar error in the decompiled code, but it should not affect your interpretation.</li>
</ul> </ul>
<div class="section" id="options"> <div class="section" id="options">
<span id="options"></span><h2>Options<a class="headerlink" href="#options" title="Permalink to this headline"></a></h2> <span id="options"></span><h2>Options<a class="headerlink" href="#options" title="Permalink to this headline"></a></h2>
@ -227,8 +232,66 @@
</table></div> </table></div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<div class="section" id="decompile-java-lang-string">
<span id="decompile-java-lang-string"></span><h3>Decompile <code class="docutils literal notranslate"><span class="pre">java.lang.String</span></code><a class="headerlink" href="#decompile-java-lang-string" title="Permalink to this headline"></a></h3>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">$</span> <span class="n">jad</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">String</span>
<span class="nl">ClassLoader:</span>
<span class="nl">Location:</span>
<span class="cm">/*</span>
<span class="cm">* Decompiled with CFR 0_132.</span>
<span class="cm">*/</span>
<span class="kn">package</span> <span class="nn">java.lang</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.ObjectStreamField</span><span class="o">;</span>
<span class="o">...</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">String</span>
<span class="kd">implements</span> <span class="n">Serializable</span><span class="o">,</span>
<span class="n">Comparable</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;,</span>
<span class="n">CharSequence</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="kt">char</span><span class="o">[]</span> <span class="n">value</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">hash</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6849794470754667710L</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">ObjectStreamField</span><span class="o">[]</span> <span class="n">serialPersistentFields</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObjectStreamField</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Comparator</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">CASE_INSENSITIVE_ORDER</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CaseInsensitiveComparator</span><span class="o">();</span>
<span class="kd">public</span> <span class="nf">String</span><span class="o">(</span><span class="kt">byte</span><span class="o">[]</span> <span class="n">arrby</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n2</span><span class="o">)</span> <span class="o">{</span>
<span class="n">String</span><span class="o">.</span><span class="na">checkBounds</span><span class="o">(</span><span class="n">arrby</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">n2</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">value</span> <span class="o">=</span> <span class="n">StringCoding</span><span class="o">.</span><span class="na">decode</span><span class="o">(</span><span class="n">arrby</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">n2</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</pre></div>
</div>
</div>
<div class="section" id="decompile-the-specified-method">
<span id="decompile-the-specified-method"></span><h3>Decompile the specified method<a class="headerlink" href="#decompile-the-specified-method" title="Permalink to this headline"></a></h3>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span>$ jad demo.MathGame main
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
Location:
/private/tmp/arthas-demo.jar
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
do {
game.run();
TimeUnit.SECONDS.sleep(1L);
} while (true);
}
Affect(row-cnt:1) cost in 228 ms.
</pre></div>
</div>
</div>
<div class="section" id="decompile-with-specified-classloader">
<span id="decompile-with-specified-classloader"></span><h3>Decompile with specified classLoader<a class="headerlink" href="#decompile-with-specified-classloader" title="Permalink to this headline"></a></h3>
<blockquote> <blockquote>
<div>If the target class is loaded by multiple classloaders, <code class="docutils literal notranslate"><span class="pre">jad</span></code> outputs the <code class="docutils literal notranslate"><span class="pre">hashcode</span></code> of the corresponding classloaders, then you can re-run <code class="docutils literal notranslate"><span class="pre">jad</span></code> and specify <code class="docutils literal notranslate"><span class="pre">-c</span> <span class="pre">&lt;hashcode&gt;</span></code> to de-compile the target class from the specified classloader.</div></blockquote> <div>If the target class is loaded by multiple classloaders, <code class="docutils literal notranslate"><span class="pre">jad</span></code> outputs the <code class="docutils literal notranslate"><span class="pre">hashcode</span></code> of the corresponding classloaders, then you can re-run <code class="docutils literal notranslate"><span class="pre">jad</span></code> and specify <code class="docutils literal notranslate"><span class="pre">-c</span> <span class="pre">&lt;hashcode&gt;</span></code> to decompile the target class from the specified classloader.</div></blockquote>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span>$ jad org.apache.log4j.Logger <div class="highlight-java notranslate"><div class="highlight"><pre><span></span>$ jad org.apache.log4j.Logger
Found more than one class for: org.apache.log4j.Logger, Please use jad -c hashcode org.apache.log4j.Logger Found more than one class for: org.apache.log4j.Logger, Please use jad -c hashcode org.apache.log4j.Logger
@ -247,7 +310,7 @@ ClassLoader:
+-monitor&#39;s ModuleClassLoader +-monitor&#39;s ModuleClassLoader
Location: Location:
/Users/zhuyong/Downloads/taobao-hsf.sar/plugins/monitor/lib/log4j-1.2.14.jar /Users/admin/app/log4j-1.2.14.jar
package org.apache.log4j; package org.apache.log4j;
@ -262,103 +325,11 @@ public class Logger extends Category
super(name); super(name);
} }
public static Logger getLogger(String name) ...
{
return LogManager.getLogger(name);
}
public static Logger getLogger(Class clazz)
{
return LogManager.getLogger(clazz.getName());
}
public static Logger getRootLogger()
{
return LogManager.getRootLogger();
}
public static Logger getLogger(String name, LoggerFactory factory)
{
return LogManager.getLogger(name, factory);
}
public void trace(Object message)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, null);
}
}
public void trace(Object message, Throwable t)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, t);
}
}
public boolean isTraceEnabled()
{
if (repository.isDisabled(5000))
{
return false;
}
return Level.TRACE.isGreaterOrEqual(getEffectiveLevel());
}
static
{
Logger.FQCN = Logger.class.getName();
}
}
Affect(row-cnt:1) cost in 190 ms. Affect(row-cnt:1) cost in 190 ms.
</pre></div> </pre></div>
</div> </div>
<p>De-compile the specified method:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ jad com.taobao.container.web.arthas.rest.MetricsController directMetrics
ClassLoader:
+-com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@14dad5dc
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@a38d7a3
Location:
/Users/zhuyong/middleware/tomcat-web/tomcat-web-web/target/classes/
private Map&lt;String, Object&gt; directMetrics<span class="o">(</span>String ip, String<span class="o">[]</span> metrics<span class="o">)</span> <span class="o">{</span>
JSONObject obj<span class="p">;</span>
HashMap&lt;String, Object&gt; <span class="nv">result</span> <span class="o">=</span> new HashMap&lt;String, Object&gt;<span class="o">()</span><span class="p">;</span>
result.put<span class="o">(</span><span class="s2">&quot;success&quot;</span>, <span class="nb">false</span><span class="o">)</span><span class="p">;</span>
String <span class="nv">metricUrl</span> <span class="o">=</span> <span class="s2">&quot;http://&quot;</span> + ip + <span class="s2">&quot;:8006/metrics/specific&quot;</span><span class="p">;</span>
String <span class="nv">postBody</span> <span class="o">=</span> Arrays.stream<span class="o">(</span>metrics<span class="o">)</span>.map<span class="o">(</span>metric -&gt; <span class="s2">&quot;metric=&quot;</span> + metric<span class="o">)</span>.collect<span class="o">(</span>Collectors.joining<span class="o">(</span><span class="s2">&quot;&amp;&quot;</span><span class="o">))</span><span class="p">;</span>
HttpClientUtils.Response <span class="nv">resp</span> <span class="o">=</span> HttpClientUtils.sendPostRequest<span class="o">((</span>String<span class="o">)</span>metricUrl, <span class="o">(</span>String<span class="o">)</span>postBody<span class="o">)</span><span class="p">;</span>
<span class="k">if</span> <span class="o">(</span>resp.isSuccess<span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="o">(</span><span class="nv">obj</span> <span class="o">=</span> JSON.parseObject<span class="o">(</span>resp.getContent<span class="o">()))</span>.containsKey<span class="o">(</span><span class="s2">&quot;success&quot;</span><span class="o">)</span> <span class="o">&amp;&amp;</span> obj.getBoolean<span class="o">(</span><span class="s2">&quot;success&quot;</span><span class="o">)</span>.booleanValue<span class="o">()</span> <span class="o">&amp;&amp;</span> obj.containsKey<span class="o">(</span><span class="s2">&quot;data&quot;</span><span class="o">))</span> <span class="o">{</span>
JSONArray <span class="nv">dataArray</span> <span class="o">=</span> obj.getJSONArray<span class="o">(</span><span class="s2">&quot;data&quot;</span><span class="o">)</span><span class="p">;</span>
HashMap&lt;String, Object&gt; <span class="nv">metricMap</span> <span class="o">=</span> new HashMap&lt;String, Object&gt;<span class="o">()</span><span class="p">;</span>
<span class="k">for</span> <span class="o">(</span>Object aDataArray : dataArray<span class="o">)</span> <span class="o">{</span>
JSONObject <span class="nv">o</span> <span class="o">=</span> <span class="o">(</span>JSONObject<span class="o">)</span>aDataArray<span class="p">;</span>
metricMap.put<span class="o">(</span>o.getString<span class="o">(</span><span class="s2">&quot;metric&quot;</span><span class="o">)</span>, o.get<span class="o">(</span><span class="s2">&quot;value&quot;</span><span class="o">))</span><span class="p">;</span>
<span class="o">}</span>
result.put<span class="o">(</span><span class="s2">&quot;data&quot;</span>, metricMap<span class="o">)</span><span class="p">;</span>
result.put<span class="o">(</span><span class="s2">&quot;success&quot;</span>, <span class="nb">true</span><span class="o">)</span><span class="p">;</span>
<span class="k">return</span> result<span class="p">;</span>
<span class="o">}</span>
<span class="k">return</span> result<span class="p">;</span>
<span class="o">}</span>
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">1508</span> ms.
</pre></div>
</div> </div>
</div> </div>
</div> </div>

@ -276,20 +276,32 @@
</table></div> </table></div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ monitor -c <span class="m">5</span> com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ monitor -c <span class="m">5</span> demo.MathGame primeFactors
Press Ctrl+C to abort. 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. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">94</span> ms.
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
<span class="m">2015</span>-12-17 <span class="m">10</span>:56:40 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="m">10</span> <span class="m">10</span> <span class="m">0</span> <span class="m">2</span>.00 <span class="m">0</span>.00% <span class="m">2018</span>-12-03 <span class="m">19</span>:06:38 demo.MathGame primeFactors <span class="m">5</span> <span class="m">1</span> <span class="m">4</span> <span class="m">1</span>.15 <span class="m">80</span>.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
<span class="m">2015</span>-12-17 <span class="m">10</span>:56:45 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="m">11</span> <span class="m">11</span> <span class="m">0</span> <span class="m">2</span>.18 <span class="m">0</span>.00% <span class="m">2018</span>-12-03 <span class="m">19</span>:06:43 demo.MathGame primeFactors <span class="m">5</span> <span class="m">3</span> <span class="m">2</span> <span class="m">42</span>.29 <span class="m">40</span>.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
<span class="m">2015</span>-12-17 <span class="m">10</span>:56:50 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="m">0</span> <span class="m">0</span> <span class="m">0</span> <span class="m">0</span>.00 <span class="m">0</span>.00% <span class="m">2018</span>-12-03 <span class="m">19</span>:06:48 demo.MathGame primeFactors <span class="m">5</span> <span class="m">3</span> <span class="m">2</span> <span class="m">67</span>.92 <span class="m">40</span>.00%
timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
-----------------------------------------------------------------------------------------------
<span class="m">2018</span>-12-03 <span class="m">19</span>:06:53 demo.MathGame primeFactors <span class="m">5</span> <span class="m">2</span> <span class="m">3</span> <span class="m">0</span>.25 <span class="m">60</span>.00%
timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
-----------------------------------------------------------------------------------------------
<span class="m">2018</span>-12-03 <span class="m">19</span>:06:58 demo.MathGame primeFactors <span class="m">1</span> <span class="m">1</span> <span class="m">0</span> <span class="m">0</span>.45 <span class="m">0</span>.00%
timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
-----------------------------------------------------------------------------------------------
<span class="m">2018</span>-12-03 <span class="m">19</span>:07:03 demo.MathGame primeFactors <span class="m">2</span> <span class="m">2</span> <span class="m">0</span> <span class="m">3182</span>.72 <span class="m">0</span>.00%
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -97,7 +97,7 @@
</ul> </ul>
</li> </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="#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-sysenv-command">4. Get the Main Class of the process with the sysenv command</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="#decompile-main-class-with-jad-command">5. Decompile Main Class with jad 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="#watch">6. watch</a></li>
<li class="toctree-l2"><a class="reference internal" href="#exit-arthas">7. Exit Arthas</a></li> <li class="toctree-l2"><a class="reference internal" href="#exit-arthas">7. Exit Arthas</a></li>
@ -180,8 +180,8 @@
<span id="quick-start"></span><h1>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline"></a></h1> <span id="quick-start"></span><h1>Quick Start<a class="headerlink" href="#quick-start" title="Permalink to this headline"></a></h1>
<div class="section" id="start-demo-application"> <div class="section" id="start-demo-application">
<span id="start-demo-application"></span><h2>1. Start Demo Application<a class="headerlink" href="#start-demo-application" title="Permalink to this headline"></a></h2> <span id="start-demo-application"></span><h2>1. Start Demo Application<a class="headerlink" href="#start-demo-application" title="Permalink to this headline"></a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>wget https://alibaba.github.io/arthas/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 $ java -jar arthas-demo.jar
</pre></div> </pre></div>
</div> </div>
<p><code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> is a simple program that generates a random number every second, then find all prime factors of the number.</p> <p><code class="docutils literal notranslate"><span class="pre">arthas-demo</span></code> is a simple program that generates a random number every second, then find all prime factors of the number.</p>
@ -192,8 +192,8 @@ java -jar arthas-demo.jar
<div class="section" id="linux-unix-mac"> <div class="section" id="linux-unix-mac">
<span id="linux-unix-mac"></span><h3>Linux/Unix/Mac<a class="headerlink" href="#linux-unix-mac" title="Permalink to this headline"></a></h3> <span id="linux-unix-mac"></span><h3>Linux/Unix/Mac<a class="headerlink" href="#linux-unix-mac" title="Permalink to this headline"></a></h3>
<p>Execute the following command in the command line:</p> <p>Execute the following command in the command line:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>wget https://alibaba.github.io/arthas/arthas-boot.jar <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> <ul class="simple">
@ -264,10 +264,10 @@ java.home /Library/Java/JavaVir
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="get-the-main-class-of-the-process-with-the-sysenv-command"> <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-sysenv-command"></span><h2>4. Get the Main Class of the process with the sysenv command<a class="headerlink" href="#get-the-main-class-of-the-process-with-the-sysenv-command" title="Permalink to this headline"></a></h2> <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>$ sysenv | grep MAIN <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ thread -n -1 | grep &#39;main(&#39;
JAVA_MAIN_CLASS_71560 demo.MathGame at demo.MathGame.main(MathGame.java:17)
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -312,7 +312,7 @@
<div class="section" id="v2016-01-18"> <div class="section" id="v2016-01-18">
<span id="v2016-01-18"></span><h2>v2016-01-18<a class="headerlink" href="#v2016-01-18" title="Permalink to this headline"></a></h2> <span id="v2016-01-18"></span><h2>v2016-01-18<a class="headerlink" href="#v2016-01-18" title="Permalink to this headline"></a></h2>
<ul class="simple"> <ul class="simple">
<li>[improvement] optimise <a class="reference external" href="jad.md"><code class="docutils literal notranslate"><span class="pre">jad</span></code></a>; dump memory byte array in real time; using <code class="docutils literal notranslate"><span class="pre">jd-core-java</span></code> to de-compile; line number presented;</li> <li>[improvement] optimise <a class="reference external" href="jad.md"><code class="docutils literal notranslate"><span class="pre">jad</span></code></a>; dump memory byte array in real time; using <code class="docutils literal notranslate"><span class="pre">jd-core-java</span></code> to decompile; line number presented;</li>
<li>[bug] fix checking/re-producing issues when <a class="reference external" href="tt.md"><code class="docutils literal notranslate"><span class="pre">tt</span></code></a> is watching thread-context related methods invoking</li> <li>[bug] fix checking/re-producing issues when <a class="reference external" href="tt.md"><code class="docutils literal notranslate"><span class="pre">tt</span></code></a> is watching thread-context related methods invoking</li>
</ul> </ul>
</div> </div>

@ -238,12 +238,46 @@
</div> </div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<p>For example, use <code class="docutils literal notranslate"><span class="pre">sc</span> <span class="pre">-df</span> <span class="pre">class-name</span></code> to view classs static fields:</p> <ul>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ sc -df org.apache.commons.lang.StringUtils <li><p class="first">Wildcards match search</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sc demo.*
demo.MathGame
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">55</span> ms.
</pre></div>
</div>
</li>
<li><p class="first">View class details</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sc -d demo.MathGame
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface <span class="nb">false</span>
isAnnotation <span class="nb">false</span>
isEnum <span class="nb">false</span>
isAnonymousClass <span class="nb">false</span>
isArray <span class="nb">false</span>
isLocalClass <span class="nb">false</span>
isMemberClass <span class="nb">false</span>
isPrimitive <span class="nb">false</span>
isSynthetic <span class="nb">false</span>
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
classLoaderHash 3d4eac69
class-info org.apache.commons.lang.StringUtils Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">875</span> ms.
code-source /Users/zhuyong/middleware/citrus-sample/petstore/web/target/petstore/WEB-INF/lib/commons-lang-2.4.jar </pre></div>
name org.apache.commons.lang.StringUtils </div>
</li>
<li><p class="first">View class fileds</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sc -d -f demo.MathGame
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface <span class="nb">false</span> isInterface <span class="nb">false</span>
isAnnotation <span class="nb">false</span> isAnnotation <span class="nb">false</span>
isEnum <span class="nb">false</span> isEnum <span class="nb">false</span>
@ -253,31 +287,29 @@
isMemberClass <span class="nb">false</span> isMemberClass <span class="nb">false</span>
isPrimitive <span class="nb">false</span> isPrimitive <span class="nb">false</span>
isSynthetic <span class="nb">false</span> isSynthetic <span class="nb">false</span>
simple-name StringUtils simple-name MathGame
modifier public modifier public
annotation annotation
interfaces interfaces
super-class +-java.lang.Object super-class +-java.lang.Object
class-loader +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader class-loader +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
+-org.apache.catalina.loader.StandardClassLoader@1d44eef3 +-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@57a462c9 classLoaderHash 3d4eac69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6951a712 fields modifierprivate,static
fields modifier final,public,static <span class="nb">type</span> java.util.Random
<span class="nb">type</span> java.lang.String name random
name EMPTY value java.util.Random@522b4
value 08a
modifier final,public,static modifierprivate
<span class="nb">type</span> int <span class="nb">type</span> int
name INDEX_NOT_FOUND name illegalArgumentCount
value -1
modifier final,private,static Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">19</span> ms.
<span class="nb">type</span> int
name PAD_LIMIT
value <span class="m">8192</span>
</pre></div> </pre></div>
</div> </div>
</li>
</ul>
</div> </div>
</div> </div>

File diff suppressed because one or more lines are too long

@ -227,72 +227,66 @@
</table></div> </table></div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<p>Show methods from <code class="docutils literal notranslate"><span class="pre">org.apache.catalina.connector.Connector</span></code>:</p> <p>View methods of <code class="docutils literal notranslate"><span class="pre">java.lang.String</span></code>:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm org.apache.catalina.connector.Connector <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm java.lang.String
org.apache.catalina.connector.Connector-&gt;&lt;init&gt; java.lang.String-&gt;&lt;init&gt;
org.apache.catalina.connector.Connector-&gt;setProperty java.lang.String-&gt;equals
org.apache.catalina.connector.Connector-&gt;getProperty java.lang.String-&gt;toString
org.apache.catalina.connector.Connector-&gt;toString java.lang.String-&gt;hashCode
org.apache.catalina.connector.Connector-&gt;resume java.lang.String-&gt;compareTo
org.apache.catalina.connector.Connector-&gt;getScheme java.lang.String-&gt;indexOf
org.apache.catalina.connector.Connector-&gt;getProtocol java.lang.String-&gt;valueOf
org.apache.catalina.connector.Connector-&gt;getPort java.lang.String-&gt;checkBounds
org.apache.catalina.connector.Connector-&gt;setService java.lang.String-&gt;length
org.apache.catalina.connector.Connector-&gt;setPort java.lang.String-&gt;isEmpty
org.apache.catalina.connector.Connector-&gt;getService java.lang.String-&gt;charAt
org.apache.catalina.connector.Connector-&gt;getAttribute java.lang.String-&gt;codePointAt
org.apache.catalina.connector.Connector-&gt;setAttribute java.lang.String-&gt;codePointBefore
org.apache.catalina.connector.Connector-&gt;getLocalPort java.lang.String-&gt;codePointCount
org.apache.catalina.connector.Connector-&gt;pause java.lang.String-&gt;offsetByCodePoints
org.apache.catalina.connector.Connector-&gt;setProtocol java.lang.String-&gt;getChars
org.apache.catalina.connector.Connector-&gt;initInternal java.lang.String-&gt;getBytes
org.apache.catalina.connector.Connector-&gt;setSecure java.lang.String-&gt;contentEquals
org.apache.catalina.connector.Connector-&gt;getSecure java.lang.String-&gt;nonSyncContentEquals
org.apache.catalina.connector.Connector-&gt;startInternal java.lang.String-&gt;equalsIgnoreCase
org.apache.catalina.connector.Connector-&gt;stopInternal java.lang.String-&gt;compareToIgnoreCase
org.apache.catalina.connector.Connector-&gt;setScheme java.lang.String-&gt;regionMatches
org.apache.catalina.connector.Connector-&gt;createRequest java.lang.String-&gt;startsWith
org.apache.catalina.connector.Connector-&gt;getDomainInternal java.lang.String-&gt;endsWith
org.apache.catalina.connector.Connector-&gt;getProtocolHandler java.lang.String-&gt;indexOfSupplementary
org.apache.catalina.connector.Connector-&gt;setURIEncoding java.lang.String-&gt;lastIndexOf
org.apache.catalina.connector.Connector-&gt;findSslHostConfigs java.lang.String-&gt;lastIndexOfSupplementary
org.apache.catalina.connector.Connector-&gt;destroyInternal java.lang.String-&gt;substring
org.apache.catalina.connector.Connector-&gt;getObjectNameKeyProperties java.lang.String-&gt;subSequence
org.apache.catalina.connector.Connector-&gt;getAllowTrace java.lang.String-&gt;concat
org.apache.catalina.connector.Connector-&gt;setAllowTrace java.lang.String-&gt;replace
org.apache.catalina.connector.Connector-&gt;getAsyncTimeout java.lang.String-&gt;matches
org.apache.catalina.connector.Connector-&gt;setAsyncTimeout java.lang.String-&gt;contains
org.apache.catalina.connector.Connector-&gt;getEnableLookups java.lang.String-&gt;replaceFirst
org.apache.catalina.connector.Connector-&gt;setEnableLookups java.lang.String-&gt;replaceAll
org.apache.catalina.connector.Connector-&gt;getMaxCookieCount java.lang.String-&gt;split
... java.lang.String-&gt;join
java.lang.String-&gt;toLowerCase
java.lang.String-&gt;toUpperCase
java.lang.String-&gt;trim
java.lang.String-&gt;toCharArray
java.lang.String-&gt;format
java.lang.String-&gt;copyValueOf
java.lang.String-&gt;intern
Affect<span class="o">(</span>row-cnt:44<span class="o">)</span> cost in <span class="m">1342</span> ms.
</pre></div> </pre></div>
</div> </div>
<p>Show methods details from <code class="docutils literal notranslate"><span class="pre">org.apache.catalina.connector.Connector</span></code>:</p> <p>View method <code class="docutils literal notranslate"><span class="pre">java.lang.String#toString</span></code> details:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm org.apache.catalina.connector.Connector -d <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm -d java.lang.String toString
declaring-class org.apache.catalina.connector.Connector declaring-class java.lang.String
constructor-name &lt;init&gt; method-name toString
modifier public modifier public
annotation annotation
parameters parameters
<span class="k">return</span> java.lang.String
exceptions exceptions
declaring-class org.apache.catalina.connector.Connector Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">3</span> ms.
constructor-name &lt;init&gt;
modifier public
annotation
parameters java.lang.String
exceptions
declaring-class org.apache.catalina.connector.Connector
method-name setProperty
modifier public
annotation
parameters java.lang.String
java.lang.String
<span class="k">return</span> boolean
exceptions
......
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -121,8 +121,8 @@
<li class="toctree-l4"><a class="reference internal" href="#use-x-to-check-more-details">Use <code class="docutils literal notranslate"><span class="pre">-x</span></code> to check more details</a></li> <li class="toctree-l4"><a class="reference internal" href="#use-x-to-check-more-details">Use <code class="docutils literal notranslate"><span class="pre">-x</span></code> to check more details</a></li>
<li class="toctree-l4"><a class="reference internal" href="#use-condition-expressions-to-locate-specific-call">Use condition expressions to locate specific call</a></li> <li class="toctree-l4"><a class="reference internal" href="#use-condition-expressions-to-locate-specific-call">Use condition expressions to locate specific call</a></li>
<li class="toctree-l4"><a class="reference internal" href="#check-exceptions">Check <code class="docutils literal notranslate"><span class="pre">exceptions</span></code></a></li> <li class="toctree-l4"><a class="reference internal" href="#check-exceptions">Check <code class="docutils literal notranslate"><span class="pre">exceptions</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#filter-based-on-time-cost">Filter based on time cost</a></li> <li class="toctree-l4"><a class="reference internal" href="#filter-by-time-cost">Filter by time cost</a></li>
<li class="toctree-l4"><a class="reference internal" href="#check-the-global-properties-of-the-target-object">Check the global properties of the target object</a></li> <li class="toctree-l4"><a class="reference internal" href="#check-the-field-of-the-target-object">Check the field of the target object</a></li>
</ul> </ul>
</li> </li>
</ul> </ul>
@ -210,7 +210,7 @@
<div class="section" id="watch"> <div class="section" id="watch">
<span id="watch"></span><h1>watch<a class="headerlink" href="#watch" title="Permalink to this headline"></a></h1> <span id="watch"></span><h1>watch<a class="headerlink" href="#watch" title="Permalink to this headline"></a></h1>
<p>Monitor methods in data aspect including <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">values</span></code>, <code class="docutils literal notranslate"><span class="pre">exceptions</span></code> and <code class="docutils literal notranslate"><span class="pre">parameters</span></code>.</p> <p>Monitor methods in data aspect including <code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">values</span></code>, <code class="docutils literal notranslate"><span class="pre">exceptions</span></code> and <code class="docutils literal notranslate"><span class="pre">parameters</span></code>.</p>
<p>With the help of <a class="reference external" href="https://en.wikipedia.org/wiki/OGNL">OGNL</a>, you can easily check the details of variables when methods being invoked.</p> <p>With the help of <a class="reference external" href="https://commons.apache.org/proper/commons-ognl/index.html">OGNL</a>, you can easily check the details of variables when methods being invoked.</p>
<div class="section" id="parameters-options"> <div class="section" id="parameters-options">
<span id="parameters-options"></span><h2>Parameters &amp; Options<a class="headerlink" href="#parameters-options" title="Permalink to this headline"></a></h2> <span id="parameters-options"></span><h2>Parameters &amp; Options<a class="headerlink" href="#parameters-options" title="Permalink to this headline"></a></h2>
<p>There are four different scenarios for <code class="docutils literal notranslate"><span class="pre">watch</span></code> command, which makes it rather complicated.</p> <p>There are four different scenarios for <code class="docutils literal notranslate"><span class="pre">watch</span></code> command, which makes it rather complicated.</p>
@ -282,260 +282,197 @@
</div> </div>
<div class="section" id="usage"> <div class="section" id="usage">
<span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2> <span id="usage"></span><h2>Usage<a class="headerlink" href="#usage" title="Permalink to this headline"></a></h2>
<p>A demo:</p> <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 class="highlight-java notranslate"><div class="highlight"><pre><span></span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">execute</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="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>
</pre></div>
</div>
<div class="section" id="check-the-out-parameters-and-return-value"> <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> <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-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span> <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>
Press Ctrl+C to abort. 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">44</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">44</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:16:51<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">1</span>.280502ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">4</span><span class="o">]</span>, @Integer<span class="o">[</span><span class="m">535629513</span><span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, <span class="o">]</span>,
@ArrayList<span class="o">[</span>
@Integer<span class="o">[</span><span class="m">3</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">19</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">191</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">49199</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="check-in-parameters"> <div class="section" id="check-in-parameters">
<span id="check-in-parameters"></span><h3>Check <code class="docutils literal notranslate"><span class="pre">in</span> <span class="pre">parameters</span></code><a class="headerlink" href="#check-in-parameters" title="Permalink to this headline"></a></h3> <span id="check-in-parameters"></span><h3>Check <code class="docutils literal notranslate"><span class="pre">in</span> <span class="pre">parameters</span></code><a class="headerlink" href="#check-in-parameters" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span> -b <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> -b
Press Ctrl+C to abort. 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">48</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">50</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:23:23<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.0353ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, @Integer<span class="o">[</span>-1077465243<span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
null, null,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<p>Compared to the previous <em>check</em>, there are two differences:</p> <p>Compared to the previous <em>check</em>:</p>
<ol class="simple"> <ul class="simple">
<li>size of <code class="docutils literal notranslate"><span class="pre">params[0]</span></code> is <code class="docutils literal notranslate"><span class="pre">2</span></code> instead of <code class="docutils literal notranslate"><span class="pre">4</span></code>;</li>
<li><code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">value</span></code> is <code class="docutils literal notranslate"><span class="pre">null</span></code> since its <code class="docutils literal notranslate"><span class="pre">-b</span></code>.</li> <li><code class="docutils literal notranslate"><span class="pre">return</span> <span class="pre">value</span></code> is <code class="docutils literal notranslate"><span class="pre">null</span></code> since its <code class="docutils literal notranslate"><span class="pre">-b</span></code>.</li>
</ol> </ul>
</div> </div>
<div class="section" id="check-before-and-after-at-the-same-time"> <div class="section" id="check-before-and-after-at-the-same-time">
<span id="check-before-and-after-at-the-same-time"></span><h3>Check <em>before</em> and <em>after</em> at the same time<a class="headerlink" href="#check-before-and-after-at-the-same-time" title="Permalink to this headline"></a></h3> <span id="check-before-and-after-at-the-same-time"></span><h3>Check <em>before</em> and <em>after</em> at the same time<a class="headerlink" href="#check-before-and-after-at-the-same-time" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span> -b -s <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params,target,returnObj}&quot;</span> -x <span class="m">2</span> -b -s -n <span class="m">2</span>
Press Ctrl+C to abort. 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">59</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">46</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:29:54<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.01696ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, @Integer<span class="o">[</span><span class="m">1544665400</span><span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, <span class="o">]</span>,
@MathGame<span class="o">[</span>
<span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>java.util.Random@522b408a<span class="o">]</span>,
<span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13038</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
null, null,
<span class="o">]</span> <span class="o">]</span>
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:29:54<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">4</span>.277392ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">4</span><span class="o">]</span>, @Integer<span class="o">[</span><span class="m">1544665400</span><span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, <span class="o">]</span>,
@MathGame<span class="o">[</span>
<span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>java.util.Random@522b408a<span class="o">]</span>,
<span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13038</span><span class="o">]</span>,
<span class="o">]</span>,
@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">2</span><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">5</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">5</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">73</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">241</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">439</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<p>F.Y.I</p> <p>F.Y.I</p>
<ol class="simple"> <ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">-n</span> <span class="pre">2</span></code>: threshold of execution times is 2.</li>
<li>the first block of output is the <em>before watching</em> point;</li> <li>the first block of output is the <em>before watching</em> point;</li>
<li>the order of the output determined by the <em>watching</em> order itself (nothing to do with the order of the options <code class="docutils literal notranslate"><span class="pre">-b</span> <span class="pre">-s</span></code>).</li> <li>*the order of the output determined by the <em>watching</em> order itself (nothing to do with the order of the options <code class="docutils literal notranslate"><span class="pre">-b</span> <span class="pre">-s</span></code>).</li>
</ol> </ul>
</div> </div>
<div class="section" id="use-x-to-check-more-details"> <div class="section" id="use-x-to-check-more-details">
<span id="use-x-to-check-more-details"></span><h3>Use <code class="docutils literal notranslate"><span class="pre">-x</span></code> to check more details<a class="headerlink" href="#use-x-to-check-more-details" title="Permalink to this headline"></a></h3> <span id="use-x-to-check-more-details"></span><h3>Use <code class="docutils literal notranslate"><span class="pre">-x</span></code> to check more details<a class="headerlink" href="#use-x-to-check-more-details" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">3</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params,target}&quot;</span> -x <span class="m">3</span>
Press Ctrl+C to abort. 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">59</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">58</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:34:19<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.587833ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span> @Integer<span class="o">[</span><span class="m">47816758</span><span class="o">]</span>,
@String<span class="o">[</span>a<span class="o">]</span>,
@String<span class="o">[</span>b<span class="o">]</span>,
@String<span class="o">[</span>c<span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@ArrayList<span class="o">[</span> @MathGame<span class="o">[</span>
@String<span class="o">[</span>c<span class="o">]</span>, <span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>
<span class="nv">serialVersionUID</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">3905348978240129619</span><span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>, <span class="nv">seed</span><span class="o">=</span>@AtomicLong<span class="o">[</span><span class="m">3133719055989</span><span class="o">]</span>,
<span class="nv">multiplier</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">25214903917</span><span class="o">]</span>,
<span class="nv">addend</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">11</span><span class="o">]</span>,
<span class="nv">mask</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">281474976710655</span><span class="o">]</span>,
<span class="nv">DOUBLE_UNIT</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">1</span>.1102230246251565E-16<span class="o">]</span>,
<span class="nv">BadBound</span><span class="o">=</span>@String<span class="o">[</span>bound must be positive<span class="o">]</span>,
<span class="nv">BadRange</span><span class="o">=</span>@String<span class="o">[</span>bound must be greater than origin<span class="o">]</span>,
<span class="nv">BadSize</span><span class="o">=</span>@String<span class="o">[</span>size must be non-negative<span class="o">]</span>,
<span class="nv">seedUniquifier</span><span class="o">=</span>@AtomicLong<span class="o">[</span>-3282039941672302964<span class="o">]</span>,
<span class="nv">nextNextGaussian</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">0</span>.0<span class="o">]</span>,
<span class="nv">haveNextNextGaussian</span><span class="o">=</span>@Boolean<span class="o">[</span>false<span class="o">]</span>,
<span class="nv">serialPersistentFields</span><span class="o">=</span>@ObjectStreamField<span class="o">[][</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">3</span><span class="o">]</span>,
<span class="nv">unsafe</span><span class="o">=</span>@Unsafe<span class="o">[</span>sun.misc.Unsafe@2eaa1027<span class="o">]</span>,
<span class="nv">seedOffset</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">24</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
<span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13159</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">-x</span></code>: Expand level of object (1 by default)</li>
</ul>
</div> </div>
<div class="section" id="use-condition-expressions-to-locate-specific-call"> <div class="section" id="use-condition-expressions-to-locate-specific-call">
<span id="use-condition-expressions-to-locate-specific-call"></span><h3>Use condition expressions to locate specific call<a class="headerlink" href="#use-condition-expressions-to-locate-specific-call" title="Permalink to this headline"></a></h3> <span id="use-condition-expressions-to-locate-specific-call"></span><h3>Use condition expressions to locate specific call<a class="headerlink" href="#use-condition-expressions-to-locate-specific-call" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd <span class="s2">&quot;{params, returnObj}&quot;</span> <span class="s2">&quot;params[0].equals(&#39;aaa&#39;)&quot;</span> -x <span class="m">2</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params[0],target}&quot;</span> <span class="s2">&quot;params[0]&lt;0&quot;</span>
Press Ctrl+C to abort. 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">29</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">68</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:36:04<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.530255ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Integer<span class="o">[</span>-18178089<span class="o">]</span>,
@String<span class="o">[</span>aaa<span class="o">]</span>, @MathGame<span class="o">[</span>demo.MathGame@41cf53f9<span class="o">]</span>,
@String<span class="o">[</span>bbb<span class="o">]</span>,
<span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">6</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="check-exceptions"> <div class="section" id="check-exceptions">
<span id="check-exceptions"></span><h3>Check <code class="docutils literal notranslate"><span class="pre">exceptions</span></code><a class="headerlink" href="#check-exceptions" title="Permalink to this headline"></a></h3> <span id="check-exceptions"></span><h3>Check <code class="docutils literal notranslate"><span class="pre">exceptions</span></code><a class="headerlink" href="#check-exceptions" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd <span class="s2">&quot;{params, throwExp}&quot;</span> -e -x <span class="m">2</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params[0],throwExp}&quot;</span> -e -x <span class="m">2</span>
Press Ctrl+C to abort. 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">29</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">62</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:38:00<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">1</span>.414993ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Integer<span class="o">[</span>-1120397038<span class="o">]</span>,
@String<span class="o">[</span>aaa<span class="o">]</span>, java.lang.IllegalArgumentException: number is: -1120397038, need &gt;<span class="o">=</span> <span class="m">2</span>
@String<span class="o">[</span>bbb<span class="o">]</span>, at demo.MathGame.primeFactors<span class="o">(</span>MathGame.java:46<span class="o">)</span>
<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>
java.lang.NullPointerException ,
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.testAdd<span class="o">(</span>UserManagerImpl.java:75<span class="o">)</span>
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.register<span class="o">(</span>UserManagerImpl.java:60<span class="o">)</span>
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction.doRegister<span class="o">(</span>RegisterAction.java:45<span class="o">)</span>
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction<span class="nv">$$</span>FastClassByCGLIB<span class="nv">$$</span>ad5428f1.invoke<span class="o">(</span>&lt;generated&gt;<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.AbstractModuleEventAdapter.executeAndReturn<span class="o">(</span>AbstractModuleEventAdapter.java:100<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.AbstractModuleEventAdapter.execute<span class="o">(</span>AbstractModuleEventAdapter.java:58<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke<span class="o">(</span>PerformActionValve.java:63<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>
at com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.doFilter<span class="o">(</span>WebxFrameworkFilter.java:152<span class="o">)</span>
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter<span class="o">(</span>FilterBean.java:148<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter<span class="o">(</span>ApplicationFilterChain.java:241<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.doFilter<span class="o">(</span>ApplicationFilterChain.java:208<span class="o">)</span>
at com.alibaba.citrus.webx.servlet.SetLoggingContextFilter.doFilter<span class="o">(</span>SetLoggingContextFilter.java:61<span class="o">)</span>
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter<span class="o">(</span>FilterBean.java:148<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter<span class="o">(</span>ApplicationFilterChain.java:241<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.doFilter<span class="o">(</span>ApplicationFilterChain.java:208<span class="o">)</span>
at org.apache.catalina.core.StandardWrapperValve.invoke<span class="o">(</span>StandardWrapperValve.java:220<span class="o">)</span>
at org.apache.catalina.core.StandardContextValve.invoke<span class="o">(</span>StandardContextValve.java:122<span class="o">)</span>
at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke<span class="o">(</span>ContextLoadFilterValve.java:152<span class="o">)</span>
at org.apache.catalina.core.StandardHostValve.invoke<span class="o">(</span>StandardHostValve.java:170<span class="o">)</span>
at org.apache.catalina.valves.ErrorReportValve.invoke<span class="o">(</span>ErrorReportValve.java:103<span class="o">)</span>
at org.apache.catalina.core.StandardEngineValve.invoke<span class="o">(</span>StandardEngineValve.java:116<span class="o">)</span>
at org.apache.catalina.connector.CoyoteAdapter.service<span class="o">(</span>CoyoteAdapter.java:429<span class="o">)</span>
at org.apache.coyote.http11.AbstractHttp11Processor.process<span class="o">(</span>AbstractHttp11Processor.java:1085<span class="o">)</span>
at org.apache.coyote.AbstractProtocol<span class="nv">$AbstractConnectionHandler</span>.process<span class="o">(</span>AbstractProtocol.java:625<span class="o">)</span>
at org.apache.tomcat.util.net.NioEndpoint<span class="nv">$SocketProcessor</span>.doRun<span class="o">(</span>NioEndpoint.java:1760<span class="o">)</span>
at org.apache.tomcat.util.net.NioEndpoint<span class="nv">$SocketProcessor</span>.run<span class="o">(</span>NioEndpoint.java:1719<span class="o">)</span>
at java.util.concurrent.ThreadPoolExecutor.runWorker<span class="o">(</span>ThreadPoolExecutor.java:1142<span class="o">)</span>
at java.util.concurrent.ThreadPoolExecutor<span class="nv">$Worker</span>.run<span class="o">(</span>ThreadPoolExecutor.java:617<span class="o">)</span>
at org.apache.tomcat.util.threads.TaskThread<span class="nv">$WrappingRunnable</span>.run<span class="o">(</span>TaskThread.java:61<span class="o">)</span>
at java.lang.Thread.run<span class="o">(</span>Thread.java:745<span class="o">)</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<ul class="simple">
<li><code class="docutils literal notranslate"><span class="pre">-e</span></code>: Trigger when an exception is thrown</li>
<li><code class="docutils literal notranslate"><span class="pre">throwExp</span></code>: the exception object</li>
</ul>
</div> </div>
<div class="section" id="filter-based-on-time-cost"> <div class="section" id="filter-by-time-cost">
<span id="filter-based-on-time-cost"></span><h3>Filter based on time cost<a class="headerlink" href="#filter-based-on-time-cost" title="Permalink to this headline"></a></h3> <span id="filter-by-time-cost"></span><h3>Filter by time cost<a class="headerlink" href="#filter-by-time-cost" title="Permalink to this headline"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> <span class="c1">#cost&gt;200 -x 3 </span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s1">&#39;{params, returnObj}&#39;</span> <span class="s1">&#39;#cost&gt;200&#39;</span> -x <span class="m">2</span>
Press Ctrl+C to abort. 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">59</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">66</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:40:28<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">2112</span>.168897ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span> @Integer<span class="o">[</span><span class="m">2141897465</span><span class="o">]</span>,
@String<span class="o">[</span>a<span class="o">]</span>,
@String<span class="o">[</span>b<span class="o">]</span>,
@String<span class="o">[</span>c<span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@ArrayList<span class="o">[</span> @ArrayList<span class="o">[</span>
@String<span class="o">[</span>c<span class="o">]</span>, @Integer<span class="o">[</span><span class="m">5</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">428379493</span><span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
<span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<p>F.Y.I <ul class="simple">
<code class="docutils literal notranslate"><span class="pre">#cost&gt;200</span></code> (<code class="docutils literal notranslate"><span class="pre">ms</span></code>) filter out all invokings that take less than <code class="docutils literal notranslate"><span class="pre">200ms</span></code>.</p> <li><code class="docutils literal notranslate"><span class="pre">#cost&gt;200</span></code> (<code class="docutils literal notranslate"><span class="pre">ms</span></code>) filter out all invokings that take less than <code class="docutils literal notranslate"><span class="pre">200ms</span></code>.</li>
</ul>
</div> </div>
<div class="section" id="check-the-global-properties-of-the-target-object"> <div class="section" id="check-the-field-of-the-target-object">
<span id="check-the-global-properties-of-the-target-object"></span><h3>Check the global properties of the target object<a class="headerlink" href="#check-the-global-properties-of-the-target-object" title="Permalink to this headline"></a></h3> <span id="check-the-field-of-the-target-object"></span><h3>Check the field of the target object<a class="headerlink" href="#check-the-field-of-the-target-object" title="Permalink to this headline"></a></h3>
<p><code class="docutils literal notranslate"><span class="pre">target</span></code> stands for the current object.</p> <ul class="simple">
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps &#39;target&#39; <li><code class="docutils literal notranslate"><span class="pre">target</span></code> is the <code class="docutils literal notranslate"><span class="pre">this</span></code> object in java.</li>
</ul>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s1">&#39;target&#39;</span>
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 128 ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">52</span> ms.
ts=2017-10-31 18:45:55;result=@MyAppsController[ <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:41:52<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.477882ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@MathGame<span class="o">[</span>
myFavAppsMapper=@$Proxy131[org.apache.ibatis.binding.MapperProxy@563e97f3], <span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>java.util.Random@522b408a<span class="o">]</span>,
getAppNameAndIdByEmpId=@$Proxy135[HardCodedTarget(type=GetAppNameAndIdByEmpId, url=http://hello.com)], <span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13355</span><span class="o">]</span>,
enableWebConsoleAppsMapper=@$Proxy132[org.apache.ibatis.binding.MapperProxy@7d51e4a8], <span class="o">]</span>
]
</pre></div> </pre></div>
</div> </div>
<p><code class="docutils literal notranslate"><span class="pre">target.field_name</span></code> stands for a global property of the current object.</p> <ul class="simple">
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps &#39;target.myFavAppsMapper&#39; <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;
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 126 ms. Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2017-10-31 18:46:17;result=@$Proxy131[ ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
m1=@Method[public boolean java.lang.Object.equals(java.lang.Object)], ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
m2=@Method[public java.lang.String java.lang.Object.toString()],
m5=@Method[public abstract java.util.List com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.listFavApps(java.util.Map)],
m3=@Method[public abstract int com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.delete(java.lang.String,java.lang.String,java.lang.String)],
m4=@Method[public abstract long com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.insert(com.taobao.container.dal.arthas.domain.MyFavAppsDO)],
m0=@Method[public native int java.lang.Object.hashCode()],
]
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -192,8 +192,36 @@
<div class="section" id="getstatic"> <div class="section" id="getstatic">
<span id="getstatic"></span><h1>getstatic<a class="headerlink" href="#getstatic" title="永久链接至标题"></a></h1> <span id="getstatic"></span><h1>getstatic<a class="headerlink" href="#getstatic" title="永久链接至标题"></a></h1>
<ul class="simple">
<li>推荐直接使用<a class="reference internal" href="ognl.html"><span class="doc">ognl</span></a>命令,更加灵活。</li>
</ul>
<p>通过getstatic命令可以方便的查看类的静态属性。使用方法为<code class="docutils literal notranslate"><span class="pre">getstatic</span> <span class="pre">class_name</span> <span class="pre">field_name</span></code></p> <p>通过getstatic命令可以方便的查看类的静态属性。使用方法为<code class="docutils literal notranslate"><span class="pre">getstatic</span> <span class="pre">class_name</span> <span class="pre">field_name</span></code></p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ getstatic demo.MathGame random
field: random
@Random<span class="o">[</span>
<span class="nv">serialVersionUID</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">3905348978240129619</span><span class="o">]</span>,
<span class="nv">seed</span><span class="o">=</span>@AtomicLong<span class="o">[</span><span class="m">120955813885284</span><span class="o">]</span>,
<span class="nv">multiplier</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">25214903917</span><span class="o">]</span>,
<span class="nv">addend</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">11</span><span class="o">]</span>,
<span class="nv">mask</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">281474976710655</span><span class="o">]</span>,
<span class="nv">DOUBLE_UNIT</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">1</span>.1102230246251565E-16<span class="o">]</span>,
<span class="nv">BadBound</span><span class="o">=</span>@String<span class="o">[</span>bound must be positive<span class="o">]</span>,
<span class="nv">BadRange</span><span class="o">=</span>@String<span class="o">[</span>bound must be greater than origin<span class="o">]</span>,
<span class="nv">BadSize</span><span class="o">=</span>@String<span class="o">[</span>size must be non-negative<span class="o">]</span>,
<span class="nv">seedUniquifier</span><span class="o">=</span>@AtomicLong<span class="o">[</span>-3282039941672302964<span class="o">]</span>,
<span class="nv">nextNextGaussian</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">0</span>.0<span class="o">]</span>,
<span class="nv">haveNextNextGaussian</span><span class="o">=</span>@Boolean<span class="o">[</span>false<span class="o">]</span>,
<span class="nv">serialPersistentFields</span><span class="o">=</span>@ObjectStreamField<span class="o">[][</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">3</span><span class="o">]</span>,
<span class="nv">unsafe</span><span class="o">=</span>@Unsafe<span class="o">[</span>sun.misc.Unsafe@2eaa1027<span class="o">]</span>,
<span class="nv">seedOffset</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">24</span><span class="o">]</span>,
<span class="o">]</span>
</pre></div>
</div>
<p>如果该静态属性是一个复杂对象还可以支持在该属性上通过ognl表示进行遍历过滤访问对象的内部属性等操作。</p> <p>如果该静态属性是一个复杂对象还可以支持在该属性上通过ognl表示进行遍历过滤访问对象的内部属性等操作。</p>
<ul class="simple">
<li>OGNL特殊用法请参考<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>例如假设n是一个MapMap的Key是一个Enum我们想过滤出Map中Key为某个Enum的值可以写如下命令</p> <p>例如假设n是一个MapMap的Key是一个Enum我们想过滤出Map中Key为某个Enum的值可以写如下命令</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ getstatic com.alibaba.arthas.Test n &#39;entrySet().iterator.{? #this.key.name()==&quot;STOP&quot;}&#39; <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ getstatic com.alibaba.arthas.Test n &#39;entrySet().iterator.{? #this.key.name()==&quot;STOP&quot;}&#39;
field: n field: n

@ -92,7 +92,7 @@
<li class="toctree-l1"><a class="reference external" href="https://alibaba.github.io/arthas/en/">English Docs</a></li> <li class="toctree-l1"><a class="reference external" href="https://alibaba.github.io/arthas/en/">English Docs</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">安装</a><ul> <li class="toctree-l1 current"><a class="current reference internal" href="#">安装</a><ul>
<li class="toctree-l2"><a class="reference internal" href="#">快速安装</a><ul> <li class="toctree-l2"><a class="reference internal" href="#">快速安装</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#arthas-boot">使用<code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code></a></li> <li class="toctree-l3"><a class="reference internal" href="#arthas-boot">使用<code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code>(推荐)</a></li>
<li class="toctree-l3"><a class="reference internal" href="#as-sh">使用<code class="docutils literal notranslate"><span class="pre">as.sh</span></code></a></li> <li class="toctree-l3"><a class="reference internal" href="#as-sh">使用<code class="docutils literal notranslate"><span class="pre">as.sh</span></code></a></li>
</ul> </ul>
</li> </li>
@ -182,24 +182,26 @@
<div class="section" id=""> <div class="section" id="">
<span id="id1"></span><h2>快速安装<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id1"></span><h2>快速安装<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="section" id="arthas-boot"> <div class="section" id="arthas-boot">
<span id="arthas-boot"></span><h3>使用<code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code><a class="headerlink" href="#arthas-boot" title="永久链接至标题"></a></h3> <span id="arthas-boot"></span><h3>使用<code class="docutils literal notranslate"><span class="pre">arthas-boot</span></code>(推荐)<a class="headerlink" href="#arthas-boot" title="永久链接至标题"></a></h3>
<p>下载<code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code>,然后用<code class="docutils literal notranslate"><span class="pre">java</span> <span class="pre">-jar</span></code>的方式启动:</p> <p>下载<code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code>,然后用<code class="docutils literal notranslate"><span class="pre">java</span> <span class="pre">-jar</span></code>的方式启动:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>wget https://alibaba.github.io/arthas/arthas-boot.jar <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
</pre></div> </pre></div>
</div> </div>
<p>打印帮助信息:</p> <p>打印帮助信息:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>java -jar arthas-boot.jar -h <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ java -jar arthas-boot.jar -h
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> <ul>
<li>如果下载速度比较慢可以使用aliyun的镜像<code class="docutils literal notranslate"><span class="pre">java</span> <span class="pre">-jar</span> <span class="pre">arthas-boot.jar</span> <span class="pre">--repo-mirror</span> <span class="pre">aliyun</span> <span class="pre">--use-http</span></code></li> <li><p class="first">如果下载速度比较慢可以使用aliyun的镜像</p>
<p><code class="docutils literal notranslate"><span class="pre">java</span> <span class="pre">-jar</span> <span class="pre">arthas-boot.jar</span> <span class="pre">--repo-mirror</span> <span class="pre">aliyun</span> <span class="pre">--use-http</span></code></p>
</li>
</ul> </ul>
</div> </div>
<div class="section" id="as-sh"> <div class="section" id="as-sh">
<span id="as-sh"></span><h3>使用<code class="docutils literal notranslate"><span class="pre">as.sh</span></code><a class="headerlink" href="#as-sh" title="永久链接至标题"></a></h3> <span id="as-sh"></span><h3>使用<code class="docutils literal notranslate"><span class="pre">as.sh</span></code><a class="headerlink" href="#as-sh" title="永久链接至标题"></a></h3>
<p>Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 <code class="docutils literal notranslate"><span class="pre">回车</span></code> 执行即可:</p> <p>Arthas 支持在 Linux/Unix/Mac 等平台上一键安装,请复制以下内容,并粘贴到命令行中,敲 <code class="docutils literal notranslate"><span class="pre">回车</span></code> 执行即可:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>curl -L https://alibaba.github.io/arthas/install.sh <span class="p">|</span> sh <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ curl -L https://alibaba.github.io/arthas/install.sh <span class="p">|</span> sh
</pre></div> </pre></div>
</div> </div>
<p>上述命令会下载启动脚本文件 <code class="docutils literal notranslate"><span class="pre">as.sh</span></code> 到当前目录,你可以放在任何地方或将其加入到 <code class="docutils literal notranslate"><span class="pre">$PATH</span></code> 中。</p> <p>上述命令会下载启动脚本文件 <code class="docutils literal notranslate"><span class="pre">as.sh</span></code> 到当前目录,你可以放在任何地方或将其加入到 <code class="docutils literal notranslate"><span class="pre">$PATH</span></code> 中。</p>
@ -211,11 +213,11 @@ java -jar arthas-boot.jar
<span id="id2"></span><h2>全量安装<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id2"></span><h2>全量安装<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>最新版本,点击下载:<a class="reference external" href="http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;g=com.taobao.arthas&amp;a=arthas-packaging&amp;e=zip&amp;c=bin&amp;v=LATEST"><img alt="Arthas" src="https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square" /></a></p> <p>最新版本,点击下载:<a class="reference external" href="http://repository.sonatype.org/service/local/artifact/maven/redirect?r=central-proxy&amp;g=com.taobao.arthas&amp;a=arthas-packaging&amp;e=zip&amp;c=bin&amp;v=LATEST"><img alt="Arthas" src="https://img.shields.io/maven-central/v/com.taobao.arthas/arthas-packaging.svg?style=flat-square" /></a></p>
<p>解压后,在文件夹里有<code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code>,直接用<code class="docutils literal notranslate"><span class="pre">java</span> <span class="pre">-jar</span></code>的方式启动:</p> <p>解压后,在文件夹里有<code class="docutils literal notranslate"><span class="pre">arthas-boot.jar</span></code>,直接用<code class="docutils literal notranslate"><span class="pre">java</span> <span class="pre">-jar</span></code>的方式启动:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>java -jar arthas-boot.jar <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ java -jar arthas-boot.jar
</pre></div> </pre></div>
</div> </div>
<p>打印帮助信息:</p> <p>打印帮助信息:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>java -jar arthas-boot.jar -h <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ java -jar arthas-boot.jar -h
</pre></div> </pre></div>
</div> </div>
</div> </div>
@ -232,7 +234,7 @@ java -jar arthas-boot.jar
<ul> <ul>
<li><p class="first">在 Linux/Unix/Mac 平台</p> <li><p class="first">在 Linux/Unix/Mac 平台</p>
<p>删除下面文件:</p> <p>删除下面文件:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>rm -rf ~/.arthas/ <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ rm -rf ~/.arthas/
</pre></div> </pre></div>
</div> </div>
</li> </li>

@ -106,7 +106,12 @@
<li class="toctree-l2"><a class="reference internal" href="dump.html">dump</a></li> <li class="toctree-l2"><a class="reference internal" href="dump.html">dump</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">jad</a><ul> <li class="toctree-l2 current"><a class="current reference internal" href="#">jad</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="#java-lang-string">编绎<code class="docutils literal notranslate"><span class="pre">java.lang.String</span></code></a></li>
<li class="toctree-l4"><a class="reference internal" href="#">反编绎指定的函数</a></li>
<li class="toctree-l4"><a class="reference internal" href="#classloader">反编绎时指定ClassLoader</a></li>
</ul>
</li>
</ul> </ul>
</li> </li>
<li class="toctree-l2"><a class="reference internal" href="classloader.html">classloader</a></li> <li class="toctree-l2"><a class="reference internal" href="classloader.html">classloader</a></li>
@ -229,6 +234,64 @@
</table></div> </table></div>
<div class="section" id=""> <div class="section" id="">
<span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="section" id="java-lang-string">
<span id="java-lang-string"></span><h3>编绎<code class="docutils literal notranslate"><span class="pre">java.lang.String</span></code><a class="headerlink" href="#java-lang-string" title="永久链接至标题"></a></h3>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span><span class="n">$</span> <span class="n">jad</span> <span class="n">java</span><span class="o">.</span><span class="na">lang</span><span class="o">.</span><span class="na">String</span>
<span class="nl">ClassLoader:</span>
<span class="nl">Location:</span>
<span class="cm">/*</span>
<span class="cm">* Decompiled with CFR 0_132.</span>
<span class="cm">*/</span>
<span class="kn">package</span> <span class="nn">java.lang</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.io.ObjectStreamField</span><span class="o">;</span>
<span class="o">...</span>
<span class="kd">public</span> <span class="kd">final</span> <span class="kd">class</span> <span class="nc">String</span>
<span class="kd">implements</span> <span class="n">Serializable</span><span class="o">,</span>
<span class="n">Comparable</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;,</span>
<span class="n">CharSequence</span> <span class="o">{</span>
<span class="kd">private</span> <span class="kd">final</span> <span class="kt">char</span><span class="o">[]</span> <span class="n">value</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="n">hash</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="kt">long</span> <span class="n">serialVersionUID</span> <span class="o">=</span> <span class="o">-</span><span class="mi">6849794470754667710L</span><span class="o">;</span>
<span class="kd">private</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">ObjectStreamField</span><span class="o">[]</span> <span class="n">serialPersistentFields</span> <span class="o">=</span> <span class="k">new</span> <span class="n">ObjectStreamField</span><span class="o">[</span><span class="mi">0</span><span class="o">];</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kd">final</span> <span class="n">Comparator</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span> <span class="n">CASE_INSENSITIVE_ORDER</span> <span class="o">=</span> <span class="k">new</span> <span class="n">CaseInsensitiveComparator</span><span class="o">();</span>
<span class="kd">public</span> <span class="nf">String</span><span class="o">(</span><span class="kt">byte</span><span class="o">[]</span> <span class="n">arrby</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n</span><span class="o">,</span> <span class="kt">int</span> <span class="n">n2</span><span class="o">)</span> <span class="o">{</span>
<span class="n">String</span><span class="o">.</span><span class="na">checkBounds</span><span class="o">(</span><span class="n">arrby</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">n2</span><span class="o">);</span>
<span class="k">this</span><span class="o">.</span><span class="na">value</span> <span class="o">=</span> <span class="n">StringCoding</span><span class="o">.</span><span class="na">decode</span><span class="o">(</span><span class="n">arrby</span><span class="o">,</span> <span class="n">n</span><span class="o">,</span> <span class="n">n2</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">...</span>
</pre></div>
</div>
</div>
<div class="section" id="">
<span id="id3"></span><h3>反编绎指定的函数<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span>$ jad demo.MathGame main
ClassLoader:
+-sun.misc.Launcher$AppClassLoader@3d4eac69
+-sun.misc.Launcher$ExtClassLoader@66350f69
Location:
/private/tmp/arthas-demo.jar
public static void main(String[] args) throws InterruptedException {
MathGame game = new MathGame();
do {
game.run();
TimeUnit.SECONDS.sleep(1L);
} while (true);
}
Affect(row-cnt:1) cost in 228 ms.
</pre></div>
</div>
</div>
<div class="section" id="classloader">
<span id="classloader"></span><h3>反编绎时指定ClassLoader<a class="headerlink" href="#classloader" title="永久链接至标题"></a></h3>
<blockquote> <blockquote>
<div>当有多个 <code class="docutils literal notranslate"><span class="pre">ClassLoader</span></code> 都加载了这个类时,<code class="docutils literal notranslate"><span class="pre">jad</span></code> 命令会输出对应 <code class="docutils literal notranslate"><span class="pre">ClassLoader</span></code> 实例的 <code class="docutils literal notranslate"><span class="pre">hashcode</span></code>,然后你只需要重新执行 <code class="docutils literal notranslate"><span class="pre">jad</span></code> 命令,并使用参数 <code class="docutils literal notranslate"><span class="pre">-c</span> <span class="pre">&lt;hashcode&gt;</span></code> 就可以反编译指定 ClassLoader 加载的那个类了;</div></blockquote> <div>当有多个 <code class="docutils literal notranslate"><span class="pre">ClassLoader</span></code> 都加载了这个类时,<code class="docutils literal notranslate"><span class="pre">jad</span></code> 命令会输出对应 <code class="docutils literal notranslate"><span class="pre">ClassLoader</span></code> 实例的 <code class="docutils literal notranslate"><span class="pre">hashcode</span></code>,然后你只需要重新执行 <code class="docutils literal notranslate"><span class="pre">jad</span></code> 命令,并使用参数 <code class="docutils literal notranslate"><span class="pre">-c</span> <span class="pre">&lt;hashcode&gt;</span></code> 就可以反编译指定 ClassLoader 加载的那个类了;</div></blockquote>
<div class="highlight-java notranslate"><div class="highlight"><pre><span></span>$ jad org.apache.log4j.Logger <div class="highlight-java notranslate"><div class="highlight"><pre><span></span>$ jad org.apache.log4j.Logger
@ -249,7 +312,7 @@ ClassLoader:
+-monitor&#39;s ModuleClassLoader +-monitor&#39;s ModuleClassLoader
Location: Location:
/Users/zhuyong/Downloads/taobao-hsf.sar/plugins/monitor/lib/log4j-1.2.14.jar /Users/admin/app/log4j-1.2.14.jar
package org.apache.log4j; package org.apache.log4j;
@ -264,103 +327,11 @@ public class Logger extends Category
super(name); super(name);
} }
public static Logger getLogger(String name) ...
{
return LogManager.getLogger(name);
}
public static Logger getLogger(Class clazz)
{
return LogManager.getLogger(clazz.getName());
}
public static Logger getRootLogger()
{
return LogManager.getRootLogger();
}
public static Logger getLogger(String name, LoggerFactory factory)
{
return LogManager.getLogger(name, factory);
}
public void trace(Object message)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, null);
}
}
public void trace(Object message, Throwable t)
{
if (repository.isDisabled(5000))
{
return;
}
if (Level.TRACE.isGreaterOrEqual(getEffectiveLevel()))
{
forcedLog(Logger.FQCN, Level.TRACE, message, t);
}
}
public boolean isTraceEnabled()
{
if (repository.isDisabled(5000))
{
return false;
}
return Level.TRACE.isGreaterOrEqual(getEffectiveLevel());
}
static
{
Logger.FQCN = Logger.class.getName();
}
}
Affect(row-cnt:1) cost in 190 ms. Affect(row-cnt:1) cost in 190 ms.
</pre></div> </pre></div>
</div> </div>
<p>反编译指定的方法:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ jad com.taobao.container.web.arthas.rest.MetricsController directMetrics
ClassLoader:
+-com.taobao.pandora.boot.loader.ReLaunchURLClassLoader@1817d444
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@14dad5dc
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@a38d7a3
Location:
/Users/zhuyong/middleware/tomcat-web/tomcat-web-web/target/classes/
private Map&lt;String, Object&gt; directMetrics<span class="o">(</span>String ip, String<span class="o">[]</span> metrics<span class="o">)</span> <span class="o">{</span>
JSONObject obj<span class="p">;</span>
HashMap&lt;String, Object&gt; <span class="nv">result</span> <span class="o">=</span> new HashMap&lt;String, Object&gt;<span class="o">()</span><span class="p">;</span>
result.put<span class="o">(</span><span class="s2">&quot;success&quot;</span>, <span class="nb">false</span><span class="o">)</span><span class="p">;</span>
String <span class="nv">metricUrl</span> <span class="o">=</span> <span class="s2">&quot;http://&quot;</span> + ip + <span class="s2">&quot;:8006/metrics/specific&quot;</span><span class="p">;</span>
String <span class="nv">postBody</span> <span class="o">=</span> Arrays.stream<span class="o">(</span>metrics<span class="o">)</span>.map<span class="o">(</span>metric -&gt; <span class="s2">&quot;metric=&quot;</span> + metric<span class="o">)</span>.collect<span class="o">(</span>Collectors.joining<span class="o">(</span><span class="s2">&quot;&amp;&quot;</span><span class="o">))</span><span class="p">;</span>
HttpClientUtils.Response <span class="nv">resp</span> <span class="o">=</span> HttpClientUtils.sendPostRequest<span class="o">((</span>String<span class="o">)</span>metricUrl, <span class="o">(</span>String<span class="o">)</span>postBody<span class="o">)</span><span class="p">;</span>
<span class="k">if</span> <span class="o">(</span>resp.isSuccess<span class="o">()</span> <span class="o">&amp;&amp;</span> <span class="o">(</span><span class="nv">obj</span> <span class="o">=</span> JSON.parseObject<span class="o">(</span>resp.getContent<span class="o">()))</span>.containsKey<span class="o">(</span><span class="s2">&quot;success&quot;</span><span class="o">)</span> <span class="o">&amp;&amp;</span> obj.getBoolean<span class="o">(</span><span class="s2">&quot;success&quot;</span><span class="o">)</span>.booleanValue<span class="o">()</span> <span class="o">&amp;&amp;</span> obj.containsKey<span class="o">(</span><span class="s2">&quot;data&quot;</span><span class="o">))</span> <span class="o">{</span>
JSONArray <span class="nv">dataArray</span> <span class="o">=</span> obj.getJSONArray<span class="o">(</span><span class="s2">&quot;data&quot;</span><span class="o">)</span><span class="p">;</span>
HashMap&lt;String, Object&gt; <span class="nv">metricMap</span> <span class="o">=</span> new HashMap&lt;String, Object&gt;<span class="o">()</span><span class="p">;</span>
<span class="k">for</span> <span class="o">(</span>Object aDataArray : dataArray<span class="o">)</span> <span class="o">{</span>
JSONObject <span class="nv">o</span> <span class="o">=</span> <span class="o">(</span>JSONObject<span class="o">)</span>aDataArray<span class="p">;</span>
metricMap.put<span class="o">(</span>o.getString<span class="o">(</span><span class="s2">&quot;metric&quot;</span><span class="o">)</span>, o.get<span class="o">(</span><span class="s2">&quot;value&quot;</span><span class="o">))</span><span class="p">;</span>
<span class="o">}</span>
result.put<span class="o">(</span><span class="s2">&quot;data&quot;</span>, metricMap<span class="o">)</span><span class="p">;</span>
result.put<span class="o">(</span><span class="s2">&quot;success&quot;</span>, <span class="nb">true</span><span class="o">)</span><span class="p">;</span>
<span class="k">return</span> result<span class="p">;</span>
<span class="o">}</span>
<span class="k">return</span> result<span class="p">;</span>
<span class="o">}</span>
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">1508</span> ms.
</pre></div>
</div> </div>
</div> </div>
</div> </div>

@ -278,20 +278,32 @@
</table></div> </table></div>
<div class="section" id=""> <div class="section" id="">
<span id="id3"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id3"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ monitor -c <span class="m">5</span> com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ monitor -c <span class="m">5</span> demo.MathGame primeFactors
Press Ctrl+C to abort. 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. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">94</span> ms.
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
<span class="m">2015</span>-12-17 <span class="m">10</span>:56:40 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="m">10</span> <span class="m">10</span> <span class="m">0</span> <span class="m">2</span>.00 <span class="m">0</span>.00% <span class="m">2018</span>-12-03 <span class="m">19</span>:06:38 demo.MathGame primeFactors <span class="m">5</span> <span class="m">1</span> <span class="m">4</span> <span class="m">1</span>.15 <span class="m">80</span>.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
<span class="m">2015</span>-12-17 <span class="m">10</span>:56:45 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="m">11</span> <span class="m">11</span> <span class="m">0</span> <span class="m">2</span>.18 <span class="m">0</span>.00% <span class="m">2018</span>-12-03 <span class="m">19</span>:06:43 demo.MathGame primeFactors <span class="m">5</span> <span class="m">3</span> <span class="m">2</span> <span class="m">42</span>.29 <span class="m">40</span>.00%
timestamp class method total success fail rt fail-rate timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
----------------------------------------------------------------------------------------------------------------------------------- -----------------------------------------------------------------------------------------------
<span class="m">2015</span>-12-17 <span class="m">10</span>:56:50 com.alibaba.sample.petstore.web.store.module.screen.ItemList execute <span class="m">0</span> <span class="m">0</span> <span class="m">0</span> <span class="m">0</span>.00 <span class="m">0</span>.00% <span class="m">2018</span>-12-03 <span class="m">19</span>:06:48 demo.MathGame primeFactors <span class="m">5</span> <span class="m">3</span> <span class="m">2</span> <span class="m">67</span>.92 <span class="m">40</span>.00%
timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
-----------------------------------------------------------------------------------------------
<span class="m">2018</span>-12-03 <span class="m">19</span>:06:53 demo.MathGame primeFactors <span class="m">5</span> <span class="m">2</span> <span class="m">3</span> <span class="m">0</span>.25 <span class="m">60</span>.00%
timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
-----------------------------------------------------------------------------------------------
<span class="m">2018</span>-12-03 <span class="m">19</span>:06:58 demo.MathGame primeFactors <span class="m">1</span> <span class="m">1</span> <span class="m">0</span> <span class="m">0</span>.45 <span class="m">0</span>.00%
timestamp class method total success fail avg-rt<span class="o">(</span>ms<span class="o">)</span> fail-rate
-----------------------------------------------------------------------------------------------
<span class="m">2018</span>-12-03 <span class="m">19</span>:07:03 demo.MathGame primeFactors <span class="m">2</span> <span class="m">2</span> <span class="m">0</span> <span class="m">3182</span>.72 <span class="m">0</span>.00%
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -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="#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="#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="#dashboard">3. 查看dashboard</a></li>
<li class="toctree-l2"><a class="reference internal" href="#sysenvmain-class">4. 通过sysenv命令来获取到进程的Main Class</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="#jadmain-class">5. 通过jad来反编绎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="#watch">6. watch</a></li>
<li class="toctree-l2"><a class="reference internal" href="#arthas">5. 退出arthas</a></li> <li class="toctree-l2"><a class="reference internal" href="#arthas">5. 退出arthas</a></li>
@ -189,8 +189,8 @@ java -jar arthas-demo.jar
<div class="section" id="arthas"> <div class="section" id="arthas">
<span id="arthas"></span><h2>2. 启动arthas<a class="headerlink" href="#arthas" title="永久链接至标题"></a></h2> <span id="arthas"></span><h2>2. 启动arthas<a class="headerlink" href="#arthas" title="永久链接至标题"></a></h2>
<p>在命令行下面执行:</p> <p>在命令行下面执行:</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>wget https://alibaba.github.io/arthas/arthas-boot.jar <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://alibaba.github.io/arthas/arthas-boot.jar
java -jar arthas-boot.jar $ java -jar arthas-boot.jar
</pre></div> </pre></div>
</div> </div>
<ul class="simple"> <ul class="simple">
@ -261,10 +261,10 @@ java.home /Library/Java/JavaVir
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id="sysenvmain-class"> <div class="section" id="threadmain-class">
<span id="sysenvmain-class"></span><h2>4. 通过sysenv命令来获取到进程的Main Class<a class="headerlink" href="#sysenvmain-class" title="永久链接至标题"></a></h2> <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>$ sysenv | grep MAIN <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ thread -n -1 | grep &#39;main(&#39;
JAVA_MAIN_CLASS_71560 demo.MathGame at demo.MathGame.main(MathGame.java:17)
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -211,7 +211,7 @@ Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span cl
<span id="arthas"></span><h2>使用新版本Arthas的异步后台任务将结果存日志文件<a class="headerlink" href="#arthas" title="永久链接至标题"></a></h2> <span id="arthas"></span><h2>使用新版本Arthas的异步后台任务将结果存日志文件<a class="headerlink" href="#arthas" title="永久链接至标题"></a></h2>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace Test t &gt;&gt; <span class="p">&amp;</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ trace Test t &gt;&gt; <span class="p">&amp;</span>
job id : <span class="m">2</span> job id : <span class="m">2</span>
cache location : /Users/zhuyong/logs/arthas-cache/28198/2 cache location : /Users/admin/logs/arthas-cache/28198/2
</pre></div> </pre></div>
</div> </div>
<p>此时命令会在后台异步执行,并将结果异步保存在文件(~/logs/arthas-cache/${PID}/${JobId})中;</p> <p>此时命令会在后台异步执行,并将结果异步保存在文件(~/logs/arthas-cache/${PID}/${JobId})中;</p>

@ -246,12 +246,46 @@
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id3"></span><h3>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id3"></span><h3>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>例如, 查看类的静态变量信息, 可以用<code class="docutils literal notranslate"><span class="pre">sc</span> <span class="pre">-df</span> <span class="pre">class-name</span></code></p> <ul>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ sc -df org.apache.commons.lang.StringUtils <li><p class="first">模糊搜索</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sc demo.*
demo.MathGame
Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">55</span> ms.
</pre></div>
</div>
</li>
<li><p class="first">打印类的详细信息</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sc -d demo.MathGame
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface <span class="nb">false</span>
isAnnotation <span class="nb">false</span>
isEnum <span class="nb">false</span>
isAnonymousClass <span class="nb">false</span>
isArray <span class="nb">false</span>
isLocalClass <span class="nb">false</span>
isMemberClass <span class="nb">false</span>
isPrimitive <span class="nb">false</span>
isSynthetic <span class="nb">false</span>
simple-name MathGame
modifier public
annotation
interfaces
super-class +-java.lang.Object
class-loader +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
classLoaderHash 3d4eac69
class-info org.apache.commons.lang.StringUtils Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">875</span> ms.
code-source /Users/zhuyong/middleware/citrus-sample/petstore/web/target/petstore/WEB-INF/lib/commons-lang-2.4.jar </pre></div>
name org.apache.commons.lang.StringUtils </div>
</li>
<li><p class="first">打印出类的Field信息</p>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sc -d -f demo.MathGame
class-info demo.MathGame
code-source /private/tmp/arthas-demo.jar
name demo.MathGame
isInterface <span class="nb">false</span> isInterface <span class="nb">false</span>
isAnnotation <span class="nb">false</span> isAnnotation <span class="nb">false</span>
isEnum <span class="nb">false</span> isEnum <span class="nb">false</span>
@ -261,31 +295,29 @@
isMemberClass <span class="nb">false</span> isMemberClass <span class="nb">false</span>
isPrimitive <span class="nb">false</span> isPrimitive <span class="nb">false</span>
isSynthetic <span class="nb">false</span> isSynthetic <span class="nb">false</span>
simple-name StringUtils simple-name MathGame
modifier public modifier public
annotation annotation
interfaces interfaces
super-class +-java.lang.Object super-class +-java.lang.Object
class-loader +-com.taobao.tomcat.container.context.loader.AliWebappClassLoader class-loader +-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@3d4eac69
+-org.apache.catalina.loader.StandardClassLoader@1d44eef3 +-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@66350f69
+-sun.misc.Launcher<span class="nv">$AppClassLoader</span>@57a462c9 classLoaderHash 3d4eac69
+-sun.misc.Launcher<span class="nv">$ExtClassLoader</span>@6951a712 fields modifierprivate,static
fields modifier final,public,static <span class="nb">type</span> java.util.Random
<span class="nb">type</span> java.lang.String name random
name EMPTY value java.util.Random@522b4
value 08a
modifier final,public,static modifierprivate
<span class="nb">type</span> int <span class="nb">type</span> int
name INDEX_NOT_FOUND name illegalArgumentCount
value -1
modifier final,private,static Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">19</span> ms.
<span class="nb">type</span> int
name PAD_LIMIT
value <span class="m">8192</span>
</pre></div> </pre></div>
</div> </div>
</li>
</ul>
</div> </div>
</div> </div>
</div> </div>

File diff suppressed because one or more lines are too long

@ -230,70 +230,64 @@
</table></div> </table></div>
<div class="section" id=""> <div class="section" id="">
<span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ sm org.apache.catalina.connector.Connector <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm java.lang.String
org.apache.catalina.connector.Connector-&gt;&lt;init&gt; java.lang.String-&gt;&lt;init&gt;
org.apache.catalina.connector.Connector-&gt;setProperty java.lang.String-&gt;equals
org.apache.catalina.connector.Connector-&gt;getProperty java.lang.String-&gt;toString
org.apache.catalina.connector.Connector-&gt;toString java.lang.String-&gt;hashCode
org.apache.catalina.connector.Connector-&gt;resume java.lang.String-&gt;compareTo
org.apache.catalina.connector.Connector-&gt;getScheme java.lang.String-&gt;indexOf
org.apache.catalina.connector.Connector-&gt;getProtocol java.lang.String-&gt;valueOf
org.apache.catalina.connector.Connector-&gt;getPort java.lang.String-&gt;checkBounds
org.apache.catalina.connector.Connector-&gt;setService java.lang.String-&gt;length
org.apache.catalina.connector.Connector-&gt;setPort java.lang.String-&gt;isEmpty
org.apache.catalina.connector.Connector-&gt;getService java.lang.String-&gt;charAt
org.apache.catalina.connector.Connector-&gt;getAttribute java.lang.String-&gt;codePointAt
org.apache.catalina.connector.Connector-&gt;setAttribute java.lang.String-&gt;codePointBefore
org.apache.catalina.connector.Connector-&gt;getLocalPort java.lang.String-&gt;codePointCount
org.apache.catalina.connector.Connector-&gt;pause java.lang.String-&gt;offsetByCodePoints
org.apache.catalina.connector.Connector-&gt;setProtocol java.lang.String-&gt;getChars
org.apache.catalina.connector.Connector-&gt;initInternal java.lang.String-&gt;getBytes
org.apache.catalina.connector.Connector-&gt;setSecure java.lang.String-&gt;contentEquals
org.apache.catalina.connector.Connector-&gt;getSecure java.lang.String-&gt;nonSyncContentEquals
org.apache.catalina.connector.Connector-&gt;startInternal java.lang.String-&gt;equalsIgnoreCase
org.apache.catalina.connector.Connector-&gt;stopInternal java.lang.String-&gt;compareToIgnoreCase
org.apache.catalina.connector.Connector-&gt;setScheme java.lang.String-&gt;regionMatches
org.apache.catalina.connector.Connector-&gt;createRequest java.lang.String-&gt;startsWith
org.apache.catalina.connector.Connector-&gt;getDomainInternal java.lang.String-&gt;endsWith
org.apache.catalina.connector.Connector-&gt;getProtocolHandler java.lang.String-&gt;indexOfSupplementary
org.apache.catalina.connector.Connector-&gt;setURIEncoding java.lang.String-&gt;lastIndexOf
org.apache.catalina.connector.Connector-&gt;findSslHostConfigs java.lang.String-&gt;lastIndexOfSupplementary
org.apache.catalina.connector.Connector-&gt;destroyInternal java.lang.String-&gt;substring
org.apache.catalina.connector.Connector-&gt;getObjectNameKeyProperties java.lang.String-&gt;subSequence
org.apache.catalina.connector.Connector-&gt;getAllowTrace java.lang.String-&gt;concat
org.apache.catalina.connector.Connector-&gt;setAllowTrace java.lang.String-&gt;replace
org.apache.catalina.connector.Connector-&gt;getAsyncTimeout java.lang.String-&gt;matches
org.apache.catalina.connector.Connector-&gt;setAsyncTimeout java.lang.String-&gt;contains
org.apache.catalina.connector.Connector-&gt;getEnableLookups java.lang.String-&gt;replaceFirst
org.apache.catalina.connector.Connector-&gt;setEnableLookups java.lang.String-&gt;replaceAll
org.apache.catalina.connector.Connector-&gt;getMaxCookieCount java.lang.String-&gt;split
... java.lang.String-&gt;join
java.lang.String-&gt;toLowerCase
java.lang.String-&gt;toUpperCase
java.lang.String-&gt;trim
java.lang.String-&gt;toCharArray
java.lang.String-&gt;format
java.lang.String-&gt;copyValueOf
java.lang.String-&gt;intern
Affect<span class="o">(</span>row-cnt:44<span class="o">)</span> cost in <span class="m">1342</span> ms.
</pre></div> </pre></div>
</div> </div>
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm org.apache.catalina.connector.Connector -d <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ sm -d java.lang.String toString
declaring-class org.apache.catalina.connector.Connector declaring-class java.lang.String
constructor-name &lt;init&gt; method-name toString
modifier public modifier public
annotation annotation
parameters parameters
<span class="k">return</span> java.lang.String
exceptions exceptions
declaring-class org.apache.catalina.connector.Connector Affect<span class="o">(</span>row-cnt:1<span class="o">)</span> cost in <span class="m">3</span> ms.
constructor-name &lt;init&gt;
modifier public
annotation
parameters java.lang.String
exceptions
declaring-class org.apache.catalina.connector.Connector
method-name setProperty
modifier public
annotation
parameters java.lang.String
java.lang.String
<span class="k">return</span> boolean
exceptions
......
</pre></div> </pre></div>
</div> </div>
</div> </div>

@ -118,7 +118,7 @@
<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>
<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> </ul>
</li> </li>
</ul> </ul>
@ -269,7 +269,7 @@
</ul> </ul>
<p><strong>特别说明</strong></p> <p><strong>特别说明</strong></p>
<ul class="simple"> <ul class="simple">
<li>watch 命令定义了4个观察事件点<code class="docutils literal notranslate"><span class="pre">-b</span></code> 方法调用前,<code class="docutils literal notranslate"><span class="pre">-e</span></code> 方法异常后,<code class="docutils literal notranslate"><span class="pre">-s</span></code> 方法返回后<code class="docutils literal notranslate"><span class="pre">-f</span></code> 方法结束后</li> <li>watch 命令定义了4个观察事件点<code class="docutils literal notranslate"><span class="pre">-b</span></code> 方法调用前,<code class="docutils literal notranslate"><span class="pre">-e</span></code> 方法异常后,<code class="docutils literal notranslate"><span class="pre">-s</span></code> 方法返回后<code class="docutils literal notranslate"><span class="pre">-f</span></code> 方法结束后</li>
<li>4个观察事件点 <code class="docutils literal notranslate"><span class="pre">-b</span></code><code class="docutils literal notranslate"><span class="pre">-e</span></code><code class="docutils literal notranslate"><span class="pre">-s</span></code> 默认关闭,<code class="docutils literal notranslate"><span class="pre">-f</span></code> 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出</li> <li>4个观察事件点 <code class="docutils literal notranslate"><span class="pre">-b</span></code><code class="docutils literal notranslate"><span class="pre">-e</span></code><code class="docutils literal notranslate"><span class="pre">-s</span></code> 默认关闭,<code class="docutils literal notranslate"><span class="pre">-f</span></code> 默认打开,当指定观察点被打开后,在相应事件点会对观察表达式进行求值并输出</li>
<li>这里要注意<code class="docutils literal notranslate"><span class="pre">方法入参</span></code><code class="docutils literal notranslate"><span class="pre">方法出参</span></code>的区别,有可能在中间被修改导致前后不一致,除了 <code class="docutils literal notranslate"><span class="pre">-b</span></code> 事件点 <code class="docutils literal notranslate"><span class="pre">params</span></code> 代表方法入参外,其余事件都代表方法出参</li> <li>这里要注意<code class="docutils literal notranslate"><span class="pre">方法入参</span></code><code class="docutils literal notranslate"><span class="pre">方法出参</span></code>的区别,有可能在中间被修改导致前后不一致,除了 <code class="docutils literal notranslate"><span class="pre">-b</span></code> 事件点 <code class="docutils literal notranslate"><span class="pre">params</span></code> 代表方法入参外,其余事件都代表方法出参</li>
<li>当使用 <code class="docutils literal notranslate"><span class="pre">-b</span></code> 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在</li> <li>当使用 <code class="docutils literal notranslate"><span class="pre">-b</span></code> 时,由于观察事件点是在方法调用前,此时返回值或异常均不存在</li>
@ -277,262 +277,194 @@
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2> <span id="id2"></span><h2>使用参考<a class="headerlink" href="#" title="永久链接至标题"></a></h2>
<p>代码示例:</p> <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 class="highlight-java notranslate"><div class="highlight"><pre><span></span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">execute</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="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>
</pre></div>
</div>
<div class="section" id=""> <div class="section" id="">
<span id="id3"></span><h3>观察方法出参和返回值<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id3"></span><h3>观察方法出参和返回值<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span> <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>
Press Ctrl+C to abort. 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">44</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">44</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:16:51<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">1</span>.280502ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">4</span><span class="o">]</span>, @Integer<span class="o">[</span><span class="m">535629513</span><span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, <span class="o">]</span>,
@ArrayList<span class="o">[</span>
@Integer<span class="o">[</span><span class="m">3</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">19</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">191</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">49199</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id4"></span><h3>观察方法入参<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id4"></span><h3>观察方法入参<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span> -b <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> -b
Press Ctrl+C to abort. 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">48</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">50</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:23:23<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.0353ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, @Integer<span class="o">[</span>-1077465243<span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
null, null,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<blockquote> <ul class="simple">
<div>对比前一个例子params[0] 其size为2入参返回值为空事件点为方法执行前因此获取不到返回值</div></blockquote> <li>对比前一个例子,返回值为空(事件点为方法执行前,因此获取不到返回值)</li>
</ul>
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id5"></span><h3>同时观察方法调用前和方法返回后<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id5"></span><h3>同时观察方法调用前和方法返回后<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">2</span> -b -s <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params,target,returnObj}&quot;</span> -x <span class="m">2</span> -b -s -n <span class="m">2</span>
Press Ctrl+C to abort. 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">59</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">46</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:29:54<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.01696ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, @Integer<span class="o">[</span><span class="m">1544665400</span><span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, <span class="o">]</span>,
@MathGame<span class="o">[</span>
<span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>java.util.Random@522b408a<span class="o">]</span>,
<span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13038</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
null, null,
<span class="o">]</span> <span class="o">]</span>
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:29:54<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">4</span>.277392ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">4</span><span class="o">]</span>, @Integer<span class="o">[</span><span class="m">1544665400</span><span class="o">]</span>,
@ArrayList<span class="o">[</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">2</span><span class="o">]</span>, <span class="o">]</span>,
@MathGame<span class="o">[</span>
<span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>java.util.Random@522b408a<span class="o">]</span>,
<span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13038</span><span class="o">]</span>,
<span class="o">]</span>,
@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">2</span><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">5</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">5</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">73</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">241</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">439</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<blockquote> <ul class="simple">
<div>这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果</div></blockquote> <li>参数里<code class="docutils literal notranslate"><span class="pre">-n</span> <span class="pre">2</span></code>,表示只执行两次</li>
<blockquote> <li>这里输出结果中,第一次输出的是方法调用前的观察表达式的结果,第二次输出的是方法返回后的表达式的结果</li>
<div>结果的顺序和命令中 <code class="docutils literal notranslate"><span class="pre">-s</span> <span class="pre">-b</span></code> 的顺序没有关系,只与事件本身的先后顺序有关</div></blockquote> <li>结果的顺序和命令中 <code class="docutils literal notranslate"><span class="pre">-s</span> <span class="pre">-b</span></code> 的顺序没有关系,只与事件本身的先后顺序有关</li>
</ul>
</div> </div>
<div class="section" id="x"> <div class="section" id="x">
<span id="x"></span><h3>调整<code class="docutils literal notranslate"><span class="pre">-x</span></code>的值,观察具体的方法参数值<a class="headerlink" href="#x" title="永久链接至标题"></a></h3> <span id="x"></span><h3>调整<code class="docutils literal notranslate"><span class="pre">-x</span></code>的值,观察具体的方法参数值<a class="headerlink" href="#x" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> -x <span class="m">3</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params,target}&quot;</span> -x <span class="m">3</span>
Press Ctrl+C to abort. 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">59</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">58</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:34:19<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.587833ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span> @Integer<span class="o">[</span><span class="m">47816758</span><span class="o">]</span>,
@String<span class="o">[</span>a<span class="o">]</span>,
@String<span class="o">[</span>b<span class="o">]</span>,
@String<span class="o">[</span>c<span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@ArrayList<span class="o">[</span> @MathGame<span class="o">[</span>
@String<span class="o">[</span>c<span class="o">]</span>, <span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>
<span class="nv">serialVersionUID</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">3905348978240129619</span><span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>, <span class="nv">seed</span><span class="o">=</span>@AtomicLong<span class="o">[</span><span class="m">3133719055989</span><span class="o">]</span>,
<span class="nv">multiplier</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">25214903917</span><span class="o">]</span>,
<span class="nv">addend</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">11</span><span class="o">]</span>,
<span class="nv">mask</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">281474976710655</span><span class="o">]</span>,
<span class="nv">DOUBLE_UNIT</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">1</span>.1102230246251565E-16<span class="o">]</span>,
<span class="nv">BadBound</span><span class="o">=</span>@String<span class="o">[</span>bound must be positive<span class="o">]</span>,
<span class="nv">BadRange</span><span class="o">=</span>@String<span class="o">[</span>bound must be greater than origin<span class="o">]</span>,
<span class="nv">BadSize</span><span class="o">=</span>@String<span class="o">[</span>size must be non-negative<span class="o">]</span>,
<span class="nv">seedUniquifier</span><span class="o">=</span>@AtomicLong<span class="o">[</span>-3282039941672302964<span class="o">]</span>,
<span class="nv">nextNextGaussian</span><span class="o">=</span>@Double<span class="o">[</span><span class="m">0</span>.0<span class="o">]</span>,
<span class="nv">haveNextNextGaussian</span><span class="o">=</span>@Boolean<span class="o">[</span>false<span class="o">]</span>,
<span class="nv">serialPersistentFields</span><span class="o">=</span>@ObjectStreamField<span class="o">[][</span><span class="nv">isEmpty</span><span class="o">=</span>false<span class="p">;</span><span class="nv">size</span><span class="o">=</span><span class="m">3</span><span class="o">]</span>,
<span class="nv">unsafe</span><span class="o">=</span>@Unsafe<span class="o">[</span>sun.misc.Unsafe@2eaa1027<span class="o">]</span>,
<span class="nv">seedOffset</span><span class="o">=</span>@Long<span class="o">[</span><span class="m">24</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
<span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13159</span><span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<blockquote> <ul class="simple">
<div><code class="docutils literal notranslate"><span class="pre">-x</span></code>表示遍历深度,可以调整来打印具体的参数和结果内容。</div></blockquote> <li><code class="docutils literal notranslate"><span class="pre">-x</span></code>表示遍历深度可以调整来打印具体的参数和结果内容默认值是1。</li>
</ul>
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id6"></span><h3>条件表达式的例子<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id6"></span><h3>条件表达式的例子<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd <span class="s2">&quot;{params, returnObj}&quot;</span> <span class="s2">&quot;params[0].equals(&#39;aaa&#39;)&quot;</span> -x <span class="m">2</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params[0],target}&quot;</span> <span class="s2">&quot;params[0]&lt;0&quot;</span>
Press Ctrl+C to abort. 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">29</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">68</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:36:04<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.530255ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Integer<span class="o">[</span>-18178089<span class="o">]</span>,
@String<span class="o">[</span>aaa<span class="o">]</span>, @MathGame<span class="o">[</span>demo.MathGame@41cf53f9<span class="o">]</span>,
@String<span class="o">[</span>bbb<span class="o">]</span>,
<span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">6</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<blockquote> <ul class="simple">
<div>只有满足条件的调用,才会有响应。</div></blockquote> <li>只有满足条件的调用,才会有响应。</li>
</ul>
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id7"></span><h3>观察异常信息的例子<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id7"></span><h3>观察异常信息的例子<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.biz.impl.UserManagerImpl testAdd <span class="s2">&quot;{params, throwExp}&quot;</span> -e -x <span class="m">2</span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s2">&quot;{params[0],throwExp}&quot;</span> -e -x <span class="m">2</span>
Press Ctrl+C to abort. 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">29</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">62</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:38:00<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">1</span>.414993ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Integer<span class="o">[</span>-1120397038<span class="o">]</span>,
@String<span class="o">[</span>aaa<span class="o">]</span>, java.lang.IllegalArgumentException: number is: -1120397038, need &gt;<span class="o">=</span> <span class="m">2</span>
@String<span class="o">[</span>bbb<span class="o">]</span>, at demo.MathGame.primeFactors<span class="o">(</span>MathGame.java:46<span class="o">)</span>
<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>
java.lang.NullPointerException ,
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.testAdd<span class="o">(</span>UserManagerImpl.java:75<span class="o">)</span>
at com.alibaba.sample.petstore.biz.impl.UserManagerImpl.register<span class="o">(</span>UserManagerImpl.java:60<span class="o">)</span>
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction.doRegister<span class="o">(</span>RegisterAction.java:45<span class="o">)</span>
at com.alibaba.sample.petstore.web.user.module.action.RegisterAction<span class="nv">$$</span>FastClassByCGLIB<span class="nv">$$</span>ad5428f1.invoke<span class="o">(</span>&lt;generated&gt;<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.AbstractModuleEventAdapter.executeAndReturn<span class="o">(</span>AbstractModuleEventAdapter.java:100<span class="o">)</span>
at com.alibaba.citrus.service.moduleloader.impl.adapter.AbstractModuleEventAdapter.execute<span class="o">(</span>AbstractModuleEventAdapter.java:58<span class="o">)</span>
at com.alibaba.citrus.turbine.pipeline.valve.PerformActionValve.invoke<span class="o">(</span>PerformActionValve.java:63<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>
at com.alibaba.citrus.webx.servlet.WebxFrameworkFilter.doFilter<span class="o">(</span>WebxFrameworkFilter.java:152<span class="o">)</span>
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter<span class="o">(</span>FilterBean.java:148<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter<span class="o">(</span>ApplicationFilterChain.java:241<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.doFilter<span class="o">(</span>ApplicationFilterChain.java:208<span class="o">)</span>
at com.alibaba.citrus.webx.servlet.SetLoggingContextFilter.doFilter<span class="o">(</span>SetLoggingContextFilter.java:61<span class="o">)</span>
at com.alibaba.citrus.webx.servlet.FilterBean.doFilter<span class="o">(</span>FilterBean.java:148<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter<span class="o">(</span>ApplicationFilterChain.java:241<span class="o">)</span>
at org.apache.catalina.core.ApplicationFilterChain.doFilter<span class="o">(</span>ApplicationFilterChain.java:208<span class="o">)</span>
at org.apache.catalina.core.StandardWrapperValve.invoke<span class="o">(</span>StandardWrapperValve.java:220<span class="o">)</span>
at org.apache.catalina.core.StandardContextValve.invoke<span class="o">(</span>StandardContextValve.java:122<span class="o">)</span>
at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke<span class="o">(</span>ContextLoadFilterValve.java:152<span class="o">)</span>
at org.apache.catalina.core.StandardHostValve.invoke<span class="o">(</span>StandardHostValve.java:170<span class="o">)</span>
at org.apache.catalina.valves.ErrorReportValve.invoke<span class="o">(</span>ErrorReportValve.java:103<span class="o">)</span>
at org.apache.catalina.core.StandardEngineValve.invoke<span class="o">(</span>StandardEngineValve.java:116<span class="o">)</span>
at org.apache.catalina.connector.CoyoteAdapter.service<span class="o">(</span>CoyoteAdapter.java:429<span class="o">)</span>
at org.apache.coyote.http11.AbstractHttp11Processor.process<span class="o">(</span>AbstractHttp11Processor.java:1085<span class="o">)</span>
at org.apache.coyote.AbstractProtocol<span class="nv">$AbstractConnectionHandler</span>.process<span class="o">(</span>AbstractProtocol.java:625<span class="o">)</span>
at org.apache.tomcat.util.net.NioEndpoint<span class="nv">$SocketProcessor</span>.doRun<span class="o">(</span>NioEndpoint.java:1760<span class="o">)</span>
at org.apache.tomcat.util.net.NioEndpoint<span class="nv">$SocketProcessor</span>.run<span class="o">(</span>NioEndpoint.java:1719<span class="o">)</span>
at java.util.concurrent.ThreadPoolExecutor.runWorker<span class="o">(</span>ThreadPoolExecutor.java:1142<span class="o">)</span>
at java.util.concurrent.ThreadPoolExecutor<span class="nv">$Worker</span>.run<span class="o">(</span>ThreadPoolExecutor.java:617<span class="o">)</span>
at org.apache.tomcat.util.threads.TaskThread<span class="nv">$WrappingRunnable</span>.run<span class="o">(</span>TaskThread.java:61<span class="o">)</span>
at java.lang.Thread.run<span class="o">(</span>Thread.java:745<span class="o">)</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<blockquote> <ul class="simple">
<div>express中表示异常信息的变量是<code class="docutils literal notranslate"><span class="pre">throwExp</span></code></div></blockquote> <li><code class="docutils literal notranslate"><span class="pre">-e</span></code>表示抛出异常时才触发</li>
<li>express中表示异常信息的变量是<code class="docutils literal notranslate"><span class="pre">throwExp</span></code></li>
</ul>
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id8"></span><h3>按照耗时进行过滤<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id8"></span><h3>按照耗时进行过滤<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<div class="highlight-shell notranslate"><div class="highlight"><pre><span></span>$ watch com.alibaba.sample.petstore.web.store.module.screen.ItemList add <span class="s2">&quot;{params,returnObj}&quot;</span> <span class="c1">#cost&gt;200 -x 3 </span> <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s1">&#39;{params, returnObj}&#39;</span> <span class="s1">&#39;#cost&gt;200&#39;</span> -x <span class="m">2</span>
Press Ctrl+C to abort. 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">59</span> ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">66</span> ms.
@ArrayList<span class="o">[</span> <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:40:28<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">2112</span>.168897ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@ArrayList<span class="o">[</span>
@Object<span class="o">[][</span> @Object<span class="o">[][</span>
@ArrayList<span class="o">[</span> @Integer<span class="o">[</span><span class="m">2141897465</span><span class="o">]</span>,
@String<span class="o">[</span>a<span class="o">]</span>,
@String<span class="o">[</span>b<span class="o">]</span>,
@String<span class="o">[</span>c<span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@ArrayList<span class="o">[</span> @ArrayList<span class="o">[</span>
@String<span class="o">[</span>c<span class="o">]</span>, @Integer<span class="o">[</span><span class="m">5</span><span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">428379493</span><span class="o">]</span>,
@String<span class="o">[</span>d<span class="o">]</span>,
<span class="o">]</span>,
<span class="o">]</span>, <span class="o">]</span>,
@Integer<span class="o">[</span><span class="m">4</span><span class="o">]</span>,
<span class="o">]</span> <span class="o">]</span>
</pre></div> </pre></div>
</div> </div>
<blockquote> <ul class="simple">
<div>#cost&gt;200(单位是<code class="docutils literal notranslate"><span class="pre">ms</span></code>)表示只有当耗时大于200ms时才会输出过滤掉执行时间小于200ms的调用</div></blockquote> <li><code class="docutils literal notranslate"><span class="pre">#cost&gt;200</span></code>(单位是<code class="docutils literal notranslate"><span class="pre">ms</span></code>)表示只有当耗时大于200ms时才会输出过滤掉执行时间小于200ms的调用</li>
</ul>
</div> </div>
<div class="section" id=""> <div class="section" id="">
<span id="id9"></span><h3>观察当前对象中的全局属性<a class="headerlink" href="#" title="永久链接至标题"></a></h3> <span id="id9"></span><h3>观察当前对象中的属性<a class="headerlink" href="#" title="永久链接至标题"></a></h3>
<p>如果想查看方法运行前后,当前对象中的全局属性,可以使用<code class="docutils literal notranslate"><span class="pre">target</span></code>关键字,代表当前对象</p> <p>如果想查看方法运行前后,当前对象中的属性,可以使用<code class="docutils literal notranslate"><span class="pre">target</span></code>关键字,代表当前对象</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ watch com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps &#39;target&#39; <div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors <span class="s1">&#39;target&#39;</span>
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 128 ms. Affect<span class="o">(</span>class-cnt:1 , method-cnt:1<span class="o">)</span> cost in <span class="m">52</span> ms.
ts=2017-10-31 18:45:55;result=@MyAppsController[ <span class="nv">ts</span><span class="o">=</span><span class="m">2018</span>-12-03 <span class="m">19</span>:41:52<span class="p">;</span> <span class="o">[</span><span class="nv">cost</span><span class="o">=</span><span class="m">0</span>.477882ms<span class="o">]</span> <span class="nv">result</span><span class="o">=</span>@MathGame<span class="o">[</span>
myFavAppsMapper=@$Proxy131[org.apache.ibatis.binding.MapperProxy@563e97f3], <span class="nv">random</span><span class="o">=</span>@Random<span class="o">[</span>java.util.Random@522b408a<span class="o">]</span>,
getAppNameAndIdByEmpId=@$Proxy135[HardCodedTarget(type=GetAppNameAndIdByEmpId, url=http://hello.com)], <span class="nv">illegalArgumentCount</span><span class="o">=</span>@Integer<span class="o">[</span><span class="m">13355</span><span class="o">]</span>,
enableWebConsoleAppsMapper=@$Proxy132[org.apache.ibatis.binding.MapperProxy@7d51e4a8], <span class="o">]</span>
]
</pre></div> </pre></div>
</div> </div>
<p>然后使用<code class="docutils literal notranslate"><span class="pre">target.field_name</span></code>访问当前对象的某个全局属性</p> <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 com.taobao.container.web.arthas.rest.MyAppsController myFavoriteApps &#39;target.myFavAppsMapper&#39; <div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ watch demo.MathGame primeFactors &#39;target.illegalArgumentCount&#39;
Press Ctrl+C to abort. Press Ctrl+C to abort.
Affect(class-cnt:1 , method-cnt:1) cost in 126 ms. Affect(class-cnt:1 , method-cnt:1) cost in 67 ms.
ts=2017-10-31 18:46:17;result=@$Proxy131[ ts=2018-12-03 20:04:34; [cost=131.303498ms] result=@Integer[8]
m1=@Method[public boolean java.lang.Object.equals(java.lang.Object)], ts=2018-12-03 20:04:35; [cost=0.961441ms] result=@Integer[8]
m2=@Method[public java.lang.String java.lang.Object.toString()],
m5=@Method[public abstract java.util.List com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.listFavApps(java.util.Map)],
m3=@Method[public abstract int com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.delete(java.lang.String,java.lang.String,java.lang.String)],
m4=@Method[public abstract long com.taobao.container.dal.arthas.mapper.MyFavAppsMapper.insert(com.taobao.container.dal.arthas.domain.MyFavAppsDO)],
m0=@Method[public native int java.lang.Object.hashCode()],
]
</pre></div> </pre></div>
</div> </div>
</div> </div>

Loading…
Cancel
Save