Closed ralf0131 closed 5 years ago
另外,数组类、接口类、枚举类以及java.lang.Class/java.lang.Integer/java.lang.reflect.Method等类都是不能进行增强的
找类需要加包名,如:com.xxx.xxx.xxxController
If you would like to search for an inner class, you have to use sc outer-class$inner-class
.
查找内部类,需要按照如下格式进行 sc outer-class$inner-class
直接 sc *Controller* 就行
Need to add English translation.
reset后又trace还是提示相同的错误,日志还是提示该类还是无法增强,
PS:该类有13k行左右。
这个没有办法。JVM本身有限制。
PS:该类有13k行左右。
这个没有办法。JVM本身有限制。
这个场景描述的真好,难道jvm在针对我?
这个场景和我的问题的区别在哪?
jad: fail to decompile class,caused by java.lang.VerifyError
jad: fail to decompile class,caused by java.lang.VerifyError
有没有可以重现的Demo
jad: fail to decompile class,caused by java.lang.VerifyError
有没有可以重现的Demo
我试试能不能把这个类分离出来
我的类明明有的,为什么用arthas找到类。 No class or method is affected, try:
问题:问啥会链接另外一个进程?pid 确认没有问题
背景:在这台机器上部署了多个程序。
开始能找到,后边过一段时间后找不到了。最后发现连接到了另外一个进程 使用sc controller 发现了另外一个进程的类
问题:问啥会链接另外一个进程?pid 确认没有问题
背景:在这台机器上部署了多个程序。
开始能找到,后边过一段时间后找不到了。最后发现连接到了另外一个进程 使用sc controller 发现了另外一个进程的类
先 shutdown ,或者指定另外的端口。不然会直接连接到之前进程 listen的端口。
我把2个进程都重启,解决了
问题:问啥会链接另外一个进程?pid 确认没有问题 背景:在这台机器上部署了多个程序。 开始能找到,后边过一段时间后找不到了。最后发现连接到了另外一个进程 使用sc controller 发现了另外一个进程的类
先 shutdown ,或者指定另外的端口。不然会直接连接到之前进程 listen的端口。
多谢
使用watch命令时,怎么区分同一个类中的同名方法呢? 比如demoMethod(String)和demoMethod(String,String)
使用watch命令时,怎么区分同一个类中的同名方法呢? 比如demoMethod(String)和demoMethod(String,String)
请问长度限制是多少?我两个controller加起来不到200行。。。
No class or method is affected, try:
想要使用watch命令监控第三方包内的方法,但是一直找不到该类。请问这种情况是什么问题导致的,可以怎么解决?
具体执行命令详情如下:
$ sm InfluxDB
org.influxdb.InfluxDB$LogLevel
5000多行的类,还有子类,报too large了
jdk8后的default 函数参考: https://github.com/alibaba/arthas/issues/1105
[arthas@25752]$ watch java.util.concurrent.ThreadPoolExecutor isTerminated "{params,returnObj}" -x 2 No class or method is affected, try:
[arthas@1768]$ watch com.company.login.servlet.LoginValidServlet info Affect(class count: 0 , method count: 0) cost in 29 ms, listenerId: 2 No class or method is affected, try:
- sm CLASS_NAME METHOD_NAME to make sure the method you are tracing actually exists (it might be in your parent class).
- reset CLASS_NAME and try again, your method body might be too large.
- check arthas log: /home/user/logs/arthas/arthas.log
- visit https://github.com/alibaba/arthas/issues/47 for more details.
[arthas@1768]$ sc com.company.login.servlet.LoginValidServlet com.company.login.servlet.LoginValidServlet Affect(row-cnt:1) cost in 12 ms.
[arthas@1768]$ sm com.company.login.servlet.LoginValidServlet com.company.login.servlet.LoginValidServlet
()V com.company.login.servlet.LoginValidServlet service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V com.company.login.servlet.LoginValidServlet info(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V com.company.login.servlet.LoginValidServlet init()V Affect(row-cnt:9) cost in 14 ms.
log:
2020-09-14 19:14:07 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -enhance matched classes: [class com.company.login.servlet.LoginValidServlet] 2020-09-14 19:14:07 [arthas-command-execute] ERROR c.t.arthas.core.advisor.Enhancer -the classloader can not load SpyAPI, ignore it. classloader: org.apache.catalina.loader.ParallelWebappClassLoader, className: com/company/login/servlet/LoginValidServlet 2020-09-14 19:14:07 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -Success to batch transform classes: [class com.company.login.servlet.LoginValidServlet]
versions:
Server version: Apache Tomcat/8.5.55 Server built: May 5 2020 22:10:54 UTC Server number: 8.5.55.0 OS Name: Linux OS Version: 3.10.0-957.21.3.el7.x86_64 Architecture: amd64 JVM Version: 1.8.0_252-b09 JVM Vendor: Oracle Corporation
@ralf0131 need help. Maybe Tomcat related.
It's working in my local pc but not working in k8s.
2020-11-15 22:55:57 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -Success to batch transform classes: [class weaver.login.VerifyLogin] 2020-11-15 23:05:27 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -enhance matched classes: [class weaver.login.VerifyLogin] 2020-11-15 23:05:27 [arthas-command-execute] ERROR c.t.arthas.core.advisor.Enhancer -the classloader can not load SpyAPI, ignore it. classloader: com.caucho.loader.EnvironmentClassLoader, className: weaver/login/VerifyLogin
你好,在使用monitor的时候有这样的一个问题
2020-11-15 22:55:57 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -Success to batch transform classes: [class weaver.login.VerifyLogin] 2020-11-15 23:05:27 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -enhance matched classes: [class weaver.login.VerifyLogin] 2020-11-15 23:05:27 [arthas-command-execute] ERROR c.t.arthas.core.advisor.Enhancer -the classloader can not load SpyAPI, ignore it. classloader: com.caucho.loader.EnvironmentClassLoader, className: weaver/login/VerifyLogin
你好,在使用monitor的时候有这样的一个问题
这是因为 com.caucho.loader.EnvironmentClassLoader 不支持加载 append 到 bootstrap classloader里的jar,是它的实现问题。后面arthas会尝试支持这种情况,目前不支持。
2020-11-15 22:55:57 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -Success to batch transform classes: [class weaver.login.VerifyLogin] 2020-11-15 23:05:27 [arthas-command-execute] INFO c.t.arthas.core.advisor.Enhancer -enhance matched classes: [class weaver.login.VerifyLogin] 2020-11-15 23:05:27 [arthas-command-execute] ERROR c.t.arthas.core.advisor.Enhancer -the classloader can not load SpyAPI, ignore it. classloader: com.caucho.loader.EnvironmentClassLoader, className: weaver/login/VerifyLogin 你好,在使用monitor的时候有这样的一个问题
这是因为 com.caucho.loader.EnvironmentClassLoader 不支持加载 append 到 bootstrap classloader里的jar,是它的实现问题。后面arthas会尝试支持这种情况,目前不支持。
我这里报的是 the classloader can not load SpyAPI, ignore it. classloader: org.eclipse.jetty.webapp.WebAppClassLoader, className: com/xxx$
请问也是因为.jetty.webapp.WebAppClassLoader 不支持加载append 到 bootstrap classloader里的jar的原因吗?
我这里报的是 the classloader can not load SpyAPI, ignore it. classloader: org.eclipse.jetty.webapp.WebAppClassLoader, className: com/xxx$
请问也是因为.jetty.webapp.WebAppClassLoader 不支持加载append 到 bootstrap classloader里的jar的原因吗?
是的
请问,如果要watch的方法的包名里包含了中文字符,arthas控制台会显示乱码,从而无法监控此类的方法,怎么办?
不能直接这样使用吗,jdk的类都不能trace吗?
trace --skipJDKMethod false java.text.SimpleDateFormat initialize
不能直接这样使用吗,jdk的类都不能trace吗?
trace --skipJDKMethod false java.text.SimpleDateFormat initialize
仔细看issue里的说明,要打开 unsafe 开关。
resolve my question, point 5
我的类明明有的,为什么用arthas找到类。 No class or method is affected, try:
- sm CLASS_NAME METHOD_NAME to make sure the method you are tracing actually exists (it might be in your parent class).
- reset CLASS_NAME and try again, your method body might be too large.
- check arthas log: /home/tomcat/logs/arthas/arthas.log
- visit No class or method is affected/Trace, watch等命令无法找到对应的类和方法 #47 for more details.
你可以使用这条命令启动arthas,注意最后面的是服务ID(不是端口号)。在cmd用你启动的项目的port去查服务ID,而不是直接使用IDEA的服务ID,那样没有用。
stack sun.misc.Unsafe allocateMemory. 是不是native. 方法不能监控
pinpoint 里的类参考:
[arthas@1105]$ sm -d com.alibaba.common.lang.enumeration.Enum createEnum process class failed: com.iwallet.biz.core.enums.InstitutionEnum, error: java.lang.NoClassDefFoundError: com/alibaba/common/resourcebundle/ResourceBundle
类已经确认被加载了,但是确认某个方法的时候,报错了。。。静态类的静态方法。。。
2024-01-24 21:59:40 [arthas-command-execute] ERROR c.t.a.c.c.k.SearchMethodCommand -process class failed: com.iwallet.biz.core.enums.InstitutionEnum, error: java.lang.NoClassDefFoundError: com/alibaba/common/resourcebundle/ResourceBundle java.lang.NoClassDefFoundError: com/alibaba/common/resourcebundle/ResourceBundle at java.base/java.lang.Class.getDeclaredConstructors0(Native Method) at java.base/java.lang.Class.privateGetDeclaredConstructors(Class.java:3549) at java.base/java.lang.Class.getDeclaredConstructors(Class.java:2727) at com.taobao.arthas.core.command.klass100.SearchMethodCommand.process(SearchMethodCommand.java:138) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108) at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) at java.base/java.lang.Thread.run(Thread.java:1583) Caused by: java.lang.ClassNotFoundException: com.alibaba.common.resourcebundle.ResourceBundle at com.alipay.sofa.loader.fast.FastURLClassLoader.findClass(FastURLClassLoader.java:128) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:593) at com.alipay.sofa.loader.fast.FastLaunchedURLClassLoader.loadClass(FastLaunchedURLClassLoader.java:116) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:526) ... 15 common frames omitted
trace org.mybatis.spring.transaction.SpringManagedTransaction getConnection -n 5 --skipJDKMethod false 在应用重启后 mybatis下的很多类不能被trace/watch 。看了下也不是动态代理。 只要执行过一次相关代码 就可以trace到了 很奇怪 @hengyunabc
分为两种情况:
一、 先用sc或者sm搜索对应的类和方法,确认有结果,确认已经被JVM加载的
系统级别的类(即
java.*
)默认不能进行增强,需要增强是请参考这里的unsafe开关,增强系统类时请谨慎操作检查下
$HOME/logs/arthas/arthas.log
,有没有ERROR c.t.arthas.core.advisor.Enhancer -the classloader can not load SpyAPI, ignore it.
的日志。如果有,则加载目标类的ClassLoader实现代码有问题,没能正确加载java.*
package下面的类。可以尝试开启arthas.enhanceLoaders=java.lang.ClassLoader
配置项 ,参考: https://github.com/alibaba/arthas/issues/1596构造函数是
<init>
,例如:watch demo.MathGame <init> '{params,returnObj,throwExp}' -v
默认情况下,enum类会被过滤掉,参考: https://github.com/alibaba/arthas/issues/1677
不支持对 lambda 生成的动态类做增强,JVM自身限制
数组类、接口类、枚举类以及java.lang.Class/java.lang.Integer/java.lang.reflect.Method等类都是不能进行增强的
由Arthas自身的ClassLoader加载的类不能被增强
在
$HOME/logs/arthas/arthas.log
中查找有没有Method code too large的异常存在该异常时,尝试用reset class_name命令对类进行恢复,再进行trace,watch等操作
二、用sc或者sm搜索对应的类和方法,结果是0时
$
符号拼出正确的类名,比如sc outer-class$inner-class