Процесс 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)
- Установите 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
Edit-комментарий от @JB Btrace теперь на github