JVM 进程 - 打印每个方法参数
JVM process - print every method argument
我们使用 InstallAnywhere 创建安装程序。最近使用它创建的安装程序开始失败并出现 Whosebug 错误(在静默安装中)。错误堆栈有数千行,如下所示。
java.lang.WhosebugError
at com.zerog.ia.installer.util.VariableManager.substitute(Unknown Source)
at com.zerog.ia.installer.util.VariableFacade.substitute(Unknown Source)
at com.zerog.ia.installer.util.VariableFacade.substitute(Unknown Source)
at com.zerog.ia.installer.util.magicfolders.MagicFolder.getPath(Unknown Source)
at com.zerog.ia.installer.util.magicfolders.MagicFolder.toString(Unknown Source)
at com.zerog.ia.installer.util.VariableManager.getValueOfVariable(Unknown Source)
at com.zerog.ia.installer.util.IAVariableStringResolver.getValueOfVariable(Unknown Source)
at com.zerog.ia.installer.util.VariableManager.substitute(Unknown Source)
VariableManager.substitute 是非常常见的 API,它接受一个字符串参数和 return 替换(评估)值。如何在真正的JVM进程中看到传递给它的参数?
解决方案是使用 btrace script.
安装进程是Java进程,可以通过JVM工具如(jps, jstack)查询
- 安装JDK(JVisualVM自带)
- 启动 VisualVM 并安装 btrace 插件
- 右键单击进程 (LAX) 开始 'btrace'
将以下 btrace 脚本复制到 btrace 控制台
package com.sun.btrace.samples;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.Profiler;
import com.sun.btrace.annotations.*;
import com.sun.btrace.*;
@BTrace class Profiling {
@Property
Profiler swingProfiler = BTraceUtils.Profiling.newProfiler();
@OnMethod(
clazz="com.zerog.ia.installer.util.VariableFacade",
method="/.*substitute.*/")
void entry( String probeMethod) {
BTraceUtils.print("Entry" );
BTraceUtils.println(BTraceUtils.timestamp() );
BTraceUtils.println(probeMethod);
}
@OnMethod(
clazz="com.zerog.ia.installer.*",
method="/.*/")
void entry2( @ProbeMethodName(fqn=true) String probeMethod ) {
BTraceUtils.print("Entry" );
BTraceUtils.println(BTraceUtils.timestamp() );
BTraceUtils.println(probeMethod);
}
@OnMethod(clazz = "com.zerog.ia.installer.*", method = "/.*/", location = @Location(Kind.RETURN))
void onPrepareReturn(AnyType arg) {
if (arg != null) {
BTraceUtils.println(arg);
}
}
}
点击“开始”图标启动btrace。
观察日志输出。
Btrace 是一个非常强大的工具,可以快速检查 JVM 内部。在 Btrace Kenai project
查看更多
Edit-comment 来自@J.B
Btrace is now at github
我们使用 InstallAnywhere 创建安装程序。最近使用它创建的安装程序开始失败并出现 Whosebug 错误(在静默安装中)。错误堆栈有数千行,如下所示。
java.lang.WhosebugError
at com.zerog.ia.installer.util.VariableManager.substitute(Unknown Source)
at com.zerog.ia.installer.util.VariableFacade.substitute(Unknown Source)
at com.zerog.ia.installer.util.VariableFacade.substitute(Unknown Source)
at com.zerog.ia.installer.util.magicfolders.MagicFolder.getPath(Unknown Source)
at com.zerog.ia.installer.util.magicfolders.MagicFolder.toString(Unknown Source)
at com.zerog.ia.installer.util.VariableManager.getValueOfVariable(Unknown Source)
at com.zerog.ia.installer.util.IAVariableStringResolver.getValueOfVariable(Unknown Source)
at com.zerog.ia.installer.util.VariableManager.substitute(Unknown Source)
VariableManager.substitute 是非常常见的 API,它接受一个字符串参数和 return 替换(评估)值。如何在真正的JVM进程中看到传递给它的参数?
解决方案是使用 btrace script.
安装进程是Java进程,可以通过JVM工具如(jps, jstack)查询
- 安装JDK(JVisualVM自带)
- 启动 VisualVM 并安装 btrace 插件
- 右键单击进程 (LAX) 开始 'btrace'
将以下 btrace 脚本复制到 btrace 控制台
package com.sun.btrace.samples;
import com.sun.btrace.BTraceUtils;
import com.sun.btrace.Profiler;
import com.sun.btrace.annotations.*;
import com.sun.btrace.*;
@BTrace class Profiling {
@Property
Profiler swingProfiler = BTraceUtils.Profiling.newProfiler();
@OnMethod(
clazz="com.zerog.ia.installer.util.VariableFacade",
method="/.*substitute.*/")
void entry( String probeMethod) {
BTraceUtils.print("Entry" );
BTraceUtils.println(BTraceUtils.timestamp() );
BTraceUtils.println(probeMethod);
}
@OnMethod(
clazz="com.zerog.ia.installer.*",
method="/.*/")
void entry2( @ProbeMethodName(fqn=true) String probeMethod ) {
BTraceUtils.print("Entry" );
BTraceUtils.println(BTraceUtils.timestamp() );
BTraceUtils.println(probeMethod);
}
@OnMethod(clazz = "com.zerog.ia.installer.*", method = "/.*/", location = @Location(Kind.RETURN))
void onPrepareReturn(AnyType arg) {
if (arg != null) {
BTraceUtils.println(arg);
}
}
}
点击“开始”图标启动btrace。
观察日志输出。
Btrace 是一个非常强大的工具,可以快速检查 JVM 内部。在 Btrace Kenai project
查看更多Edit-comment 来自@J.B Btrace is now at github