2022-07-15 22:37:32 +08:00
|
|
|
|
# FAQ
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
::: tip
|
|
|
|
|
不在本列表里的问题,请到 issue 里搜索。 [https://github.com/alibaba/arthas/issues](https://github.com/alibaba/arthas/issues)
|
|
|
|
|
:::
|
2021-03-05 01:21:00 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 日志文件在哪里?
|
2021-03-05 01:21:00 +08:00
|
|
|
|
|
|
|
|
|
日志文件路径: `~/logs/arthas/arthas.log`
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### Arthas attach 之后对原进程性能有多大的影响
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
[https://github.com/alibaba/arthas/issues/44](https://github.com/alibaba/arthas/issues/44)
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### target process not responding or HotSpot VM not loaded
|
2021-01-14 18:53:40 +08:00
|
|
|
|
|
|
|
|
|
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
|
2021-01-14 15:37:34 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
1. 检查当前用户和目标 java 进程是否一致。如果不一致,则切换到同一用户。JVM 只能 attach 同样用户下的 java 进程。
|
|
|
|
|
2. 尝试使用 `jstack -l $pid`,如果进程没有反应,则说明进程可能假死,无法响应 JVM attach 信号。所以同样基于 attach 机制的 Arthas 无法工作。尝试使用`jmap` heapdump 后分析。
|
|
|
|
|
3. 尝试按[quick-start](quick-start.md)里的方式 attach math-game。
|
2021-03-08 14:59:24 +08:00
|
|
|
|
4. 更多情况参考: [https://github.com/alibaba/arthas/issues/347](https://github.com/alibaba/arthas/issues/347)
|
2022-07-15 22:37:32 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### trace/watch 等命令能否增强 jdk 里的类?
|
2021-01-07 19:48:54 +08:00
|
|
|
|
|
2022-04-13 15:23:26 +08:00
|
|
|
|
默认情况下会过滤掉`java.`开头的类和被`BootStrap ClassLoader`加载的类。可以通过参数开启。
|
2021-01-07 19:48:54 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
options unsafe true
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
更多参考 [options](options.md)
|
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
::: tip
|
|
|
|
|
通过 java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch append 到`Bootstrap ClassLoader`的 jar 包需要开启 unsafe。
|
|
|
|
|
:::
|
2022-04-13 15:23:26 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 怎么以`json`格式查看结果
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
options json-format true
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
更多参考 [options](options.md)
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### Arthas 能否跟踪 native 函数
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
|
|
|
|
不能。
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 能不能查看内存里某个变量的值
|
2021-01-04 20:01:19 +08:00
|
|
|
|
|
2021-05-27 14:35:00 +08:00
|
|
|
|
1. 可以使用[`vmtool`](vmtool.md)命令。
|
|
|
|
|
2. 可以用一些技巧,用[`tt`](tt.md)命令拦截到对象,或者从静态函数里取到对象。
|
2021-01-05 11:01:04 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 方法同名过滤
|
2021-01-05 11:01:04 +08:00
|
|
|
|
|
|
|
|
|
同名方法过滤可以通过匹配表达式,可以使用[表达式核心变量](advice-class.md)中所有变量作为已知条件,可以通过判断参数个数`params.length ==1`, 参数类型`params[0] instanceof java.lang.Integer`、返回值类型 `returnObj instanceof java.util.List` 等等一种或者多种组合进行过滤。
|
|
|
|
|
|
|
|
|
|
可以使用 `-v` 查看观察匹配表达式的执行结果 [https://github.com/alibaba/arthas/issues/1348](https://github.com/alibaba/arthas/issues/1348)
|
|
|
|
|
|
2021-03-17 17:49:21 +08:00
|
|
|
|
例子[math-game](quick-start.md)
|
2021-01-05 11:01:04 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2021-06-10 15:58:13 +08:00
|
|
|
|
watch demo.MathGame primeFactors '{params,returnObj,throwExp}' 'params.length >0 && returnObj instanceof java.util.List' -v
|
2022-07-15 22:37:32 +08:00
|
|
|
|
```
|
2021-01-11 15:47:07 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 怎么 watch、trace 构造函数 ?
|
2021-01-11 15:47:07 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
2021-06-10 15:58:13 +08:00
|
|
|
|
watch demo.MathGame <init> '{params,returnObj,throwExp}' -v
|
2021-01-11 15:47:07 +08:00
|
|
|
|
```
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 怎样 watch、trace 内部类?
|
2022-04-13 15:23:26 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
在 JVM 规范里内部类的格式是`OuterClass$InnerClass`。
|
2022-04-13 15:23:26 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
watch OuterClass$InnerClass
|
|
|
|
|
```
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 输入中文/Unicode 字符
|
2022-01-14 17:44:35 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
把中文/Unicode 字符转为`\u`表示方法:
|
2022-01-14 17:44:35 +08:00
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
ognl '@java.lang.System@out.println("Hello \u4e2d\u6587")'
|
|
|
|
|
```
|
2021-01-11 15:47:07 +08:00
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### java.lang.ClassFormatError: null、skywalking arthas 兼容使用
|
2021-01-11 15:47:07 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
当出现这个错误日志`java.lang.ClassFormatError: null`,通常情况下都是被其他字节码工具修改过与 arthas 修改字节码不兼容。
|
2021-01-11 15:47:07 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
比如: 使用 skywalking V8.1.0 以下版本 [无法 trace、watch 被 skywalking agent 增强过的类](https://github.com/alibaba/arthas/issues/1141), V8.1.0 以上版本可以兼容使用,更多参考 skywalking 配置 [skywalking compatible with other javaagent bytecode processing](https://github.com/apache/skywalking/blob/master/docs/en/FAQ/Compatible-with-other-javaagent-bytecode-processing.md#)。
|
2021-02-08 11:25:55 +08:00
|
|
|
|
|
2022-04-26 16:36:19 +08:00
|
|
|
|
#### class redefinition failed: attempted to change the schema (add/remove fields)
|
|
|
|
|
|
|
|
|
|
参考: [https://github.com/alibaba/arthas/issues/2165](https://github.com/alibaba/arthas/issues/2165)
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### Arthas 能不能离线使用
|
2021-02-08 11:25:55 +08:00
|
|
|
|
|
2021-03-05 01:21:00 +08:00
|
|
|
|
可以。下载全量包解压即可,参考: [下载](download.md)。
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### Attach docker/k8s 里的 pid 为 1 的进程失败
|
2021-03-05 01:21:00 +08:00
|
|
|
|
|
2021-06-10 15:58:13 +08:00
|
|
|
|
参考: [https://github.com/alibaba/arthas/issues/362#issuecomment-448185416](https://github.com/alibaba/arthas/issues/362#issuecomment-448185416)
|
|
|
|
|
|
2022-07-25 16:19:40 +08:00
|
|
|
|
### 为什么下载了新版本的 Arthas,连接的却是旧版本?
|
2021-06-10 15:58:13 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
比如启动的 `as.sh/arthas-boot.jar` 版本是 3.5._ 的,但是连接上之后,打印的 arthas 版本是 3.4._ 的。
|
2021-06-10 15:58:13 +08:00
|
|
|
|
|
2022-07-15 22:37:32 +08:00
|
|
|
|
可能是之前使用旧版本的 arthas 诊断过目标进程。可以先执行`stop`停止掉旧版本的 arthas,再重新使用新版本 attach。
|