Отслеживание класса в файле WAR, развернутом в Wildfly 18

#wildfly #byteman

#wildfly #байтмен

Вопрос:

Я хотел добавить некоторую трассировку метода в нашем приложении, развернутом в Wildfly 18.

Я мог видеть, что только первое правило было загружено и напечатано из вывода консоли (но не server.log) из командной строки Windows, но другое правило никогда не печаталось.

 RULE show byteman is loaded
CLASS Main
METHOD main
AT ENTRY
IF TRUE
DO trace("Byteman at start");
   traceln("Hey Byteman ");
ENDRULE

RULE Check Method1
CLASS com.xxx.xxx.MyClass
METHOD method1
AT ENTRY
IF true
DO trace("Method1 was called");
   traceln("Method1 was called");
ENDRULE

 
 RuleTriggerMethodAdapter.injectTriggerPoint : inserting trigger into org.jboss.as.server.Main.main(java.lang.String[]) void for rule show byteman is loaded
org.jboss.byteman.agent.Transformer : inserted trigger for show byteman is loaded in class org.jboss.as.server.Main
Rule.execute called for show byteman is loaded_0:1
HelperManager.install for helper class org.jboss.byteman.rule.helper.Helper
calling installed(show byteman is loaded) for helper classorg.jboss.byteman.rule.helper.Helper
Installed rule using default helper : show byteman is loaded
show byteman is loaded execute
Byteman at startHey Byteman
 

Комментарии:

1. Он не будет печатать в server.log , потому что он будет записывать напрямую stdout . Сложно сказать, почему не отображаются другие сообщения журнала. Вы делаете что-нибудь, чтобы вызвать этот класс?

2. Да, это метод, который вызывается некоторыми другими методами. Я вижу другие записи log4j.

3. trace И traceln не используют регистратор. Они записывают непосредственно в System.out . Я не слишком уверен, почему он не будет запущен.

4. Есть ли способ устранить это? У меня включены все возможные -Dorg.jboss.byteman.transform.all=true -Dorg.jboss.byteman.verbose -Dorg.jboss.byteman.debug

5. Я не слишком уверен. Я думаю, одним из вариантов было бы создать очень простой сервлет или конечную точку JAX-RS, для которой вы создаете правило и нажимаете на конечную точку, чтобы посмотреть, зарегистрировано ли что-нибудь. Если это работает, значит, вы знаете, что часть байтмена работает.

Ответ №1:

Проблема здесь, по-видимому, заключается в том, что ваше второе правило не было введено. Трассировка Байтмена показывает только вводимое первое правило. Вы уверены, что у вас есть правильные данные в вашем правиле?

 RULE Check Method1
CLASS com.xxx.xxx.MyClass
METHOD method1
...
 

Существует ли класс com.xxx.xxx.MyClass на самом деле?

Есть ли у него метод с именем method1?

Загружается ли этот класс когда-либо?

Вызывается ли этот метод когда-либо?

Конечно, не похоже, что ответы на эти последние 2 вопроса могут быть утвердительными, потому что вы бы увидели сообщения inject и trigger, если бы это было так.