1

我们使用 InstallAnywhere 创建安装程序。最近,使用它创建的安装程序开始失败并出现 StackOverFlow 错误(在静默安装中)。错误堆栈有数千行,如下所示。

java.lang.StackOverflowError
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,它接受一个字符串参数并返回替换(评估)值。如何在真实的 JVM 进程中看到传递给它的参数?

4

1 回答 1

1

解决方案是使用btrace 脚本。

安装程序进程是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 项目中查看更多信息

@JB Btrace 的编辑评论 现在在 github

于 2015-08-27T16:05:52.420 回答