btrace ничего не печатал при вызове указанного метода - PullRequest
0 голосов
/ 04 января 2019

Я учусь использовать btrace.Для этого я создал подпружиненный проект, который содержал следующий код:

@Controller
public class MainController {
    private static Logger logger = LoggerFactory.getLogger(MainController.class);
    @ResponseBody
    @GetMapping("/testFile")
    public Map<String, Object> testFile() throws IOException {
        File file = new File("/tmp/a");
        if (file.exists()) {
            file.delete();
        }
        file.createNewFile();
        return ImmutableMap.of("success", true);
    }
}

Затем я запустил проект, используя mvn spring-boot:run, после чего я написал скрипт btrace следующим образом.

import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;

@BTrace
public class HelloWorld {

    @OnMethod(clazz = "java.io.File", method = "createNewFile")
    public static void onNewFileCreated(String fileName) {
        BTraceUtils.println("New file is being created");
        BTraceUtils.println(fileName);
    }
}

Как вы можете видеть, этот скрипт должен что-то печатать при вызове java.io.File#createNewFile, что в точности и делает вышеуказанный контроллер.Затем я подключил btrace к работающему проекту весенней загрузки, используя следующий код:

btrace 30716 HelloWorld.java

30716 - это PID работающего проекта весенней загрузки.Затем я попытался получить доступ к http://localhost:8080/testFile и получил следующий дополнительный вывод из запущенного проекта весенней загрузки.

objc[30857]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/bin/java (0x10e2744c0) and /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/libinstrument.dylib (0x1145e24e0). One of the two will be used. Which one is undefined.
2019-01-04 11:24:49.003  INFO 30857 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-01-04 11:24:49.003  INFO 30857 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2019-01-04 11:24:49.019  INFO 30857 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 16 ms

Я ожидал, что он выдаст New file is being created, но этого не произошло.Зачем?Я сделал что-то не так?

1 Ответ

0 голосов
/ 04 января 2019

Ваш метод трассировки, onNewFileCreated(String fileName), не может быть использован для перехвата java.io.File.createNewFile(), поскольку подписи не согласны (createNewFile() не принимает никаких аргументов, в то время как onNewFileCreated() имеет один).Если в методе трассировки есть аргументы (если они не имеют аннотации BTrace), BTrace попытается «связать» их с аргументами в перехваченном методе.Если это невозможно, он не будет успешно перехватывать этот метод.

Попробуйте

@OnMethod(clazz = "java.io.File", method = "createNewFile")
public static void onNewFileCreated() {
    BTraceUtils.println("method createNewFile called");
}

или

@OnMethod(clazz = "java.io.File", method = "createNewFile")
public static void onNewFileCreated(@ProbeMethodName String methodName) {
    BTraceUtils.println("method " + methodName + " called");
}

Обновление 1:

Во-первых, какую версию JDK вы используете?BTrace, похоже, не поддерживает JDK> 8 (https://github.com/btraceio/btrace/issues/292).

Во-вторых, вы можете попробовать запустить этот скрипт трассировки:

import com.sun.btrace.annotations.*;
import com.sun.btrace.BTraceUtils;

@BTrace
public class TracingScript {
    @OnMethod(clazz = "java.io.File", method = "createNewFile")
    public static void onNewFileCreated(@ProbeMethodName String methodName) {
        BTraceUtils.println("method " + methodName + " called");
    }
}

для простого тестового приложения:

import java.io.File;

public class FileCreator {

    public static void main(String[] args) throws Exception{
        for(int i = 0; i < 250; i++) {
            File file = new File("C://Temp//file" + i);
            if (file.exists()) {
                file.delete();
            }
            file.createNewFile();
            Thread.sleep(10000);
        }
    }
}

Это работает для меня с BTrace 1.3.11.3 (и через плагин BTrace Workbench JVisualVM 0.6.8, где я обычно использую BTrace).

...