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)查询

  1. 安装JDK(JVisualVM自带)
  2. 启动 VisualVM 并安装 btrace 插件

  1. 右键单击进程 (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