btrace ничего не печатал при вызове указанного метода
Я учусь использовать 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 в работающий проект spring-boot, используя следующий код.
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 ответ
Ваш метод трассировки, 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 Plugin 0.6.8, где я обычно использую BTrace).