Когда приложение столкнулось с проблемой, мы можем отслеживать строку, добавив журнал или изменил код, чтобы получить детали программы, выполняемого удаленной отладкой, но если приложение не запустило порту удаленной отладки, которую вы хотите Измените параметры, чтобы добавить параметры DEBUG JVM, затем перезапустите приложение, это не относится к онлайн-приложениям, онлайн-приложение запрещено изменять код не может быть случайным удаленным отладкой. BTRACE - это может без изменения кода, не перезапускайте приложение, динамический инструмент для просмотра сведений о работе программы. Эта статья посвящена деталям реализации и сценариев использования, если BTRACE на вывод программы BTRACE.
Установить BTrace
Официальный адрес загрузки:btrace
После загрузки установите переменную среды BTRACE_HOME и добавьте BTACE_HOME/bin в переменную среды PATH:
export BTRACE_HOME=/i/software/btrace-bin-1.3.9
export PATH=$BTRACE_HOME/bin:$PATH
Сценарии использования Btrace
-
Просмотр входных параметров и возвращаемых значений метода
-
Просмотр времени отклика метода
-
Просмотр времени отклика всех внешних вызовов в методе, что удобно для определения конкретного местоположения и причины медленного отклика метода.
-
Распечатайте стек потока вызова метода
Как использовать BTrace
Он относительно прост в использовании, просто выполнитеbtrace {javaPid} {btrace脚本}Все, если вы хотите выводить отладочную информацию в консоль, вам нужно добавить параметр -v, а параметр -o может выводить результат в файл.
Как написать скрипт BTrace
Сценарии BTrace относительно просты, в основном методе используются предоставленные инструменты BTraceUtils, вы можете обратиться к конкретным учебным пособиям.Руководство по использованию Btrace, При написании скрипта лучше всего ввести пакет Jar, предоставленный BTrace, в путь сборки, что удобно для поиска синтаксических ошибок во время компиляции.Три пакета jar BTrace находятся в каталоге сборки установочного пакета.Если вы используйте Maven для сборки проекта, вы можете добавить следующие зависимости и соответствующим образом изменить путь к btrace:
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-agent</artifactId>
<version>1.3.9</version>
<scope>system</scope>
<systemPath>I:/software/btrace-bin-1.3.9/build/btrace-agent.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-boot</artifactId>
<version>1.3.9</version>
<scope>system</scope>
<systemPath>I:/software/btrace-bin-1.3.9/build/btrace-boot.jar</systemPath>
</dependency>
<dependency>
<groupId>com.sun.tools.btrace</groupId>
<artifactId>btrace-client</artifactId>
<version>1.3.9</version>
<scope>system</scope>
<systemPath>I:/software/btrace-bin-1.3.9/build/btrace-client.jar</systemPath>
</dependency>
Я сам написал класс StringTableTest.У этого класса есть интерн-метод.Я хочу использовать скрипт btrace для отслеживания входных параметров и возвращаемых значений интерн-метода, и распечатать стек вызовов.Исходный код класса StringTableTest выглядит следующим образом, чтобы позволить BTrance отслеживать процесс, я сначала позволил основному потоку заснуть на 10 секунд:
package com.ezlippi;
import java.util.concurrent.TimeUnit;
public class StringTableTest {
public static void main(String[] args) {
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
StringTableTest test = new StringTableTest();
long ms = test.intern(1000000);
System.out.println(ms);
}
public long intern(int times) {
long start = System.currentTimeMillis();
for (int i = 0; i < times; i++) {
String.valueOf(i).intern();
}
return System.currentTimeMillis() - start;
}
}
Исходный код скрипта BTrace выглядит следующим образом: первый метод используется для вывода параметров, возвращаемого значения и времени выполнения метода, а второй метод используется для вывода того, вызывается ли 22-я строка StringTableTest.
package com.ezlippi.performanace;
import com.sun.btrace.annotations.*;
import static com.sun.btrace.BTraceUtils.*;
@BTrace
public class TraceMethodArgsAndReturn {
@OnMethod(
clazz="com.ezlippi.StringTableTest",
method="intern",
location=@Location(Kind.RETURN)
)
public static void traceExecute(int sSrc,@Return long result){
println("invoke StringTableTest.intern");
println(strcat("input arg is:", str(sSrc)));
// 打印函数返回结果result
println(strcat("result is:",str(result)));
//打印方法执行时间点
println(strcat("time is:",str(timeMillis())));
//打印线程堆栈
jstack();
}
@OnMethod(
clazz="com.ezlippi.StringTableTest",
location=@Location(value=Kind.LINE,line=22)
)
public static void traceExecute(@ProbeClassName String pcn,@ProbeMethodName String pmn,int line){
println(strcat(strcat(strcat("call ",pcn),"."),pmn));
}
}
Следует отметить, что если параметр метода является собственным типом данных, тип параметра метода traceExecute должен соответствовать ему, и тип объекта не требуется.Если параметр является объектом, он может быть представлен AnyType, а возвращаемое значение значение аналогичное.Если возвращаемое значение является типом объекта, который может быть представлен объектом.
Сначала выполните основной метод StringTableTest, затем получите PID процесса jvm с помощью команды jps и, наконец, вызовитеbtrace 13440 ./scripts/TraceMethodArgsAndReturn.javaМы распечатаем результаты, мой текущий каталог в каталоге BTRACE BIN, все скрипты в каталог сценариев BTRACE Shonient также предоставляет ряд примеров в каталоге образцов,
Я написал весь процесс в виде скрипта start.sh, просто нужно сначала выполнить основной метод в IDEA, а затем запустить start.sh:
#!/bin/bash
currentDir="$(dirname $0)"
export BTRACE_HOME=$currentDir/../
export PATH=$BTRACE_HOME/bin:$PATH
pid="$(jps | grep "StringTableTest"|cut -d " " -f1)"
btrace $pid $currentDir/scripts/TraceMethodArgsAndReturn.java
Окончательный вывод выглядит следующим образом:
call com.ezlippi.StringTableTest.intern
invoke StringTableTest.intern
input arg is:1000000
result is:628
time is:1512899327404
//线程堆栈
com.ezlippi.StringTableTest.intern(StringTableTest.java:22)
com.ezlippi.StringTableTest.main(StringTableTest.java:13)
С BTrace рабочие детали окончательного онлайн-приложения стали более удобными.