Процесс JVM - вывести каждый аргумент метода

Мы используем InstallAnywhere для создания установщиков. Недавно созданный с его помощью установщик начал давать сбой с ошибкой StackOverFlow (при автоматической установке). В стеке ошибок тысячи строк, как показано ниже.

java.lang.StackruError
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?

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

Edit-комментарий от @JB Btrace теперь на github

Другие вопросы по тегам