2016-10-30 6 views
1

Я написал простой агент:Метод Agent_OnLoad вызывается после завершения работы JVM

JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) {  
printf("Agent start"); 
} 

и простой клиент:

public class Agent { 
//java -agentpath:/path_to_lib Agent 

public static void main(String[] args) throws InterruptedException { 
    System.out.println("Main"); 
}} 

И если я запускаю программу, я буду видеть, ниже результат:

Главная

Начаток оператора

Почему метод main вызывается перед Agent_OnLoad?

+2

Можете ли вы показать, как вы используете его в командной строке? Кроме того, добавьте новую строку в printf в Agent_OnLoad, чтобы буферы были сброшены. Интересно, вызывает ли это выходы вне очереди. Вы также можете объявить статическую переменную, указывающую на завершение работы Agent_OnLoad, и проверить ее в Agent_OnUnload. – blackpen

ответ

1

Функция Agent_OnLoad вызывается перед началом во время запуска виртуальной машины, однако буфер stdout печатает после достижения newline. Добавьте \n в конце printf, чтобы увидеть, как он работает. После ответа объясняет это в деталях:

Why does printf not flush after the call unless a newline is in the format string?

Кроме того, вы можете подтвердить это, поставив точку останова на printf (Если вы используете отладчик), чтобы увидеть, что это назвали бы в начале, но выиграл 't печатать до тех пор, пока буфер не достигнет символа newline.

Смежные вопросы