site/docs/doc/faq.md
::: tip 不在本列表里的问题,请到 issue 里搜索。 https://github.com/alibaba/arthas/issues :::
日志文件路径: ~/logs/arthas/arthas.log
~/logs/arthas/arthas.logas.sh/arthas-boot.jar 的启动参数,是否指定了特定的portnetstat 检查LISTEN 3658 端口的进程,确认它是java进程,并且是想要诊断的进程LISTEN 3658 端口的进程不是 java 进程,则3658端口已经被占用。需要在as.sh/arthas-boot.jar 的启动参数指定其它端口。telnet 127.0.0.1 3658去连接本质上arthas会在应用java进程内启动一个tcp server,然后使用telnet去连接它。
如果Arthas 日志里有 Arthas server already bind.
Arthas server曾经启动过,检查目标进程打开的文件描述符。如果是linux环境,可以去 /proc/$pid/fd 下面,使用ls -alh | grep arthas,检查进程是否已加载arthas相关的 jar 包。arthas的是其它进程,也可能应用已经重启过了。https://github.com/alibaba/arthas/issues/44
com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded
jstack -l $pid,如果进程没有反应,则说明进程可能假死,无法响应 JVM attach 信号。所以同样基于 attach 机制的 Arthas 无法工作。尝试使用jmap heapdump 后分析。默认情况下会过滤掉java.开头的类和被BootStrap ClassLoader加载的类。可以通过参数开启。
options unsafe true
更多参考 options
::: tip
通过 java.lang.instrument.Instrumentation#appendToBootstrapClassLoaderSearch append 到Bootstrap ClassLoader的 jar 包需要开启 unsafe。
:::
json格式查看结果options json-format true
更多参考 options
不能。
同名方法过滤可以通过匹配表达式,可以使用表达式核心变量中所有变量作为已知条件,可以通过判断参数个数params.length ==1, 参数类型params[0] instanceof java.lang.Integer、返回值类型 returnObj instanceof java.util.List 等等一种或者多种组合进行过滤。
可以使用 -v 查看观察匹配表达式的执行结果 https://github.com/alibaba/arthas/issues/1348
watch demo.MathGame primeFactors '{params,returnObj,throwExp}' 'params.length >0 && returnObj instanceof java.util.List' -v
watch demo.MathGame <init> '{params,returnObj,throwExp}' -v
在 JVM 规范里内部类的格式是OuterClass$InnerClass。
watch OuterClass$InnerClass
对于lambda生成的类,会跳过处理,因为 JVM 本身限制对 lambda 生成的类做增强。
把中文/Unicode 字符转为\u表示方法:
ognl '@[email protected]("Hello \u4e2d\u6587")'
当出现这个错误日志java.lang.ClassFormatError: null,通常情况下都是被其他字节码工具修改过与 arthas 修改字节码不兼容。
比如: 使用 skywalking V8.1.0 以下版本 无法 trace、watch 被 skywalking agent 增强过的类, V8.1.0 以上版本可以兼容使用,更多参考 skywalking 配置 skywalking compatible with other javaagent bytecode processing。
参考: https://github.com/alibaba/arthas/issues/2165
可以。下载全量包解压即可,参考: 下载。
as.sh/arthas-boot.jar时,可以用 --use-version 参数指定。cd到arthas目录启动,这种情况会使用当前目录下的版本。参考: https://github.com/alibaba/arthas/issues/362#issuecomment-448185416
比如启动的 as.sh/arthas-boot.jar 版本是 3.5._ 的,但是连接上之后,打印的 arthas 版本是 3.4._ 的。
可能是之前使用旧版本的 arthas 诊断过目标进程。可以先执行stop停止掉旧版本的 arthas,再重新使用新版本 attach。
参考: