¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará? ¡Aquí viene la mejor práctica!

¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará? ¡Aquí viene la mejor práctica!

△ Hollis, una persona con una búsqueda única de codificación △
¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará?  ¡Aquí viene la mejor práctica!
Este es el
autor original número 291 de
Hollis l Fuente de Wang Ji l Hollis (ID: hollischuang)


Instalación paso a paso inicial

https://arthas.gitee.io/install-detail.html El
comando anterior descargará el archivo de script de inicio como.sh al directorio actual. El método de ejecución:

curl -L https://alibaba.github.io/arthas/install.sh | sh

as.sh comienza:


curl -sk https://arthas.gitee.io/arthas-boot.jar -o ~/.arthas-boot.jar  && echo "alias as.sh='java -jar ~/.arthas-boot.jar --repo-mirror aliyun --use-http'" >> ~/.bashrc && source ~/.bashrc

Experiencia tutorial en línea

https://alibaba.github.io/arthas/arthas-tutorials?language=cn por
supuesto, también puede experimentarlo localmente ~ descargando una demostración de experiencia arthas-idea-plugin directamente para comenzar localmente
https://github.com/
Descripción del comando global WangJi92 / arthas-plugin-demo :

-x 是展示结果属性遍历深度,默认为 1
-n 是执行的次数 ,q 退出

-c classloader 的hash值

退出 q ,关闭 stop

Comprender las funciones de seguimiento y vigilancia más utilizadas

¡Ver y rastrear son las funciones más utilizadas en el diagnóstico de arthas para que los desarrolladores resuelvan problemas en línea! Ejemplo de
seguimiento
básico:

trace com.wangji92.arthas.plugin.demo.controller.CommonController getRandomInteger -n 5 '1==1'

https://arthas.gitee.io/trace.html

  • Optimización del rendimiento ~
  • ¿Cómo se llama el proceso específico de este método? Se puede ver a través de la cadena de llamadas.
  • Si hay una excepción, puede ver las
    funciones avanzadas de la pila de excepciones : el
    comando trace solo rastreará las sub-llamadas en la función coincidente y no rastreará múltiples niveles hacia abajo. Debido a que el rastreo es más costoso, el rastreo de múltiples capas puede dar como resultado que se rastreen muchas clases y funciones.
    Ejemplo:
    trace -E xxxClassA|xxxClassB method1 | method2

    Como:

    trace -E com.wangji92.arthas.plugin.demo.controller.CommonController|com.wangji92.arthas.plugin.demo.service.ArthasTestService traceE|doTraceE -n 5 '1==1'

    watch
    https://arthas.gitee.io/watch.html
    wathc significa literalmente la información del valor de observación, puede ver los parámetros de entrada, los valores de retorno, las excepciones, puede ejecutar expresiones para obtener variables estáticas y target.xxx llama al objetivo Los campos, métodos, etc.están bien ~ siempre y cuando no quiera obtener nada que no pueda hacer ~
    Ejemplo básico:

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 '1==1'

Variables centrales de expresión de arthas


public class Advice {

    private final ClassLoader loader;

    private final Class<?> clazz;

    private final ArthasMethod method;

    private final Object target;

    private final Object[] params;

    private final Object returnObj;

    private final Throwable throwExp;

    private final boolean isBefore;

    private final boolean isThrow;

    private final boolean isReturn;

    // getter/setter  

}  

De watch and trace, podemos ver que el siguiente '1 == 1' ejecuta una expresión condicional. Cuando el valor es verdadero, se ejecuta una expresión ognl, watch observa params, returnObj, throwExp parámetros de entrada, valor de retorno, si La excepción también es una expresión, entonces, ¿qué está pasando?
Las expresiones el de Spring
no han estudiado ognl. Spring, quien lo ha usado durante muchos años, debe conocer sus expresiones el. También hay un concepto en las expresiones el llamado [Contexto y expresión] como se muestra a continuación, porque el contexto simple se puede resolver ". El significado del script "booleanList [0]" ~ Esto es muy familiar y fácil de entender, por lo que las expresiones ognl no son difíciles.

class Simple {

    public List<Boolean> booleanList = new ArrayList<Boolean>();

}

Simple simple = new Simple();

simple.booleanList.add(true);

StandardEvaluationContext simpleContext = new StandardEvaluationContext(simple);

// false is passed in here as a string. SpEL and the conversion service will

// correctly recognize that it needs to be a Boolean and convert it

parser.parseExpression("booleanList[0]").setValue(simpleContext, "false");

// b will be false

Boolean b = simple.booleanList.get(0);

La expresión
arthas de ognl es la misma, excepto que se usa un script llamado ognl, las variables centrales son su contexto y estos campos se pueden obtener directamente. Los campos params, returnObj y throwExp que observa el reloj son lo que llamamos el concepto de contexto, la observación de información sobre parámetros, valores de retorno y excepciones.
¡El siguiente es el código para la evaluación de expresiones y observación de observación en el código fuente de arthas! El consejo es un contexto y aquí se agrega una constante variable. ¿No es tan simple después de saber esto? ?
com.taobao.arthas.core.advisor.ReflectAdviceListenerAdapter # isConditionMet

/**

 * 判断条件是否满足,满足的情况下需要输出结果

 * @param conditionExpress 条件表达式

 * @param advice 当前的advice对象

 * @param cost 本次执行的耗时

 * @return true 如果条件表达式满足

 */

protected boolean isConditionMet(String conditionExpress, Advice advice, double cost) throws ExpressException {

    return StringUtils.isEmpty(conditionExpress) ||

            ExpressFactory.threadLocalExpress(advice).bind(Constants.COST_VARIABLE, cost).is(conditionExpress);

}

protected Object getExpressionResult(String express, Advice advice, double cost) throws ExpressException {

    return ExpressFactory.threadLocalExpress(advice)

            .bind(Constants.COST_VARIABLE, cost).get(express);

}

Práctica de expresión
El grupo de arthas a menudo pregunta cómo juzgar métodos sobrecargados, nada más que condiciones de evaluación. ¿El número de parámetros y cuál es el primer parámetro? El tipo de valor de retorno, etc. se puede utilizar como condiciones de evaluación. En la siguiente observación, la primera sección es el valor observado y la última sección es la evaluación de la expresión, que se ejecuta solo cuando se cumplen las condiciones.
La longitud del parámetro de entrada es mayor que 0:

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'params.length >0'

El valor de retorno es String y la longitud es mayor que 5:

watch com.wangji92.arthas.plugin.demo.controller.CommonController traceE '{params,returnObj,throwExp}' -n 5 -x 3 'returnObj instanceof java.lang.String && returnObj.length>5'

Expresión condicional + tareas asincrónicas
solo tienen errores en escenarios específicos ¿Cómo solucionar errores?
¿Cómo solucionar el problema que solo aparece una o dos veces al día?
Las expresiones condicionales se utilizan principalmente para el filtrado. Por ejemplo, algunos escenarios solo aparecen en parámetros específicos y tomará mucho tiempo esperar. En este momento, puede utilizar el filtrado de expresiones condicional + tareas asincrónicas.

expresión ognl

https://arthas.gitee.io/ognl.html
De lo anterior, ognl es omnipotente en la vigilancia y el rastreo. De hecho, tt también usa expresiones ognl para ejecutar la lógica. @ xxxClas @ xxxStaticField es la sintaxis de variables estáticas Sugar ognl, mira bien la documentación oficial.
Para un uso especial de OGNL, consulte: https://github.com/alibaba/arthas/issues/71
Obtención de variables estáticas Las variables
estáticas pueden ser cargadas por múltiples cargadores de clases en un jvm, y el jvm considera que una instancia debe ser cargada por un cargador de clases, por lo que necesita Conozca el valor hash de la clase estática actual (sc -d com.wangji92.arthas.plugin.demo.controller.StaticTest) se puede obtener a través de este comando.

ognl  -x  3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_DOUBLE' -c e374b99

¿Llamar al método de resorte?
watch ejecuta la sintaxis ognl para obtener el contexto de primavera y luego llama al método bean

watch -x 3 -n 1 
org.springframework.web.servlet.DispatcherServlet doDispatch '@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()).getBean("commonController").getRandomInteger()'

ognl ejecuta un contexto de primavera estático y luego llama a métodos de frijol

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("commonController").getRandomInteger()' -c e374b99

¿Se siente como despegar, omnipotente? ¡La premisa es que debes dominar una gramática simple de ognl!

completar

Para la resolución de problemas en línea, creo que estos comandos son suficientes para usted. Hay otros tipos de descompilación, gráficos de llama, .. túnel de tiempo, modificación del nivel del registrador, información del entorno jvm, etc. Siento que no hay frecuencias arriba. Alto, después de todo, la información de JVM se monitorea especialmente ~ Incluso sin arthas, puede encontrar mejores herramientas para analizar la pila y las fallas de JVM.
Vale la pena aprender y pensar en algunos casos especiales de usuarios: https://github.com/alibaba/arthas/issues?q=label%3Auser-case is
over?
¿Qué? No puedo recordar tantos comandos, y algo de sintaxis avanzada de ognl es genial ... ¿Qué pasa si te dejo obtener todas las variables de entorno de Spring? No he experimentado lo suficiente de estos dos comandos, ¿rastrear y observar? ¡Cómo puedo ser más avanzado! De acuerdo, por favor vea a continuación.


Premisa avanzada

La premisa es que tiene un conocimiento general de arthas, los comandos básicos son algo conceptuales y se puede entender la sintaxis simple de ognl.Se utilizarán expresiones condicionales simples. Decíamos antes que hay tantos comandos en arthas, ¡por eso es indispensable recordar un librito! Me siento incómodo y quiero llorar ~ No se preocupe, el hermano Wang resolverá el problema por usted.
En la actualidad, las herramientas oficiales de Arthas no son lo suficientemente simples. Algunos comandos deben recordarse, especialmente algunas gramáticas de alto nivel que son particularmente extensibles, como ognl para obtener el contexto de primavera y hacer lo que quieran, mirar y rastrear no son lo suficientemente simples, y es necesario construir cierta información de herramientas de comando. Solo necesita un complemento que pueda manejar simplemente información de cadenas. Cuando se trata de problemas en línea, se necesitan los comandos más rápidos y convenientes, por lo que el complemento arthas idea aún tiene significado y valor.
El significado de arthas idea plugin
no es tratar con problemas a nivel de protocolo, sino resolver el problema de la generación de comandos. Dado que el proyecto se gestiona en la idea, usted piensa en qué categoría desea ver. Este plugin lo sabe, ayudándole de forma más cómoda y rápida El comando de construcción. ¡Debe comprender esto cuando use el complemento arthas idea! Principalmente para resolver el problema de cómo se estructura el comando
¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará?  ¡Aquí viene la mejor práctica!

resolver el problema

Problema de prioridad de variable de entorno de Spring Obtener variables estáticas Integración de gráfico de llama Comando de registrador Integración de descompilación Integración Traza -E Integración tt Integración ...... Básicamente, todas las funciones que puede ver en las artísticas están integradas en esto. Busque la idea de arts directamente en la idea para instalarla.

Problemas comunes de uso especial

Las variables estáticas
se pueden obtener directamente mediante ognl

ognl  -x  3 '@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_DOUBLE' -c e374b99

Se puede obtener con el reloj (el cursor se coloca en el campo)

watch com.wangji92.arthas.plugin.demo.controller.StaticTest * '{params,returnObj,throwExp,@com.wangji92.arthas.plugin.demo.controller.StaticTest@INVOKE_STATIC_DOUBLE}' -n 5 -x 3 '1==1'

Las variables generales
se pueden obtener a través de spring context.getBean (). Field (esto es para configurar un contexto de primavera estático para ver la documentación de uso) tt, watch también son posibles ~ el mismo principio

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getBean("staticTest").filedValue' -c e374b99

Mira cómo te colocan en el campo

watch com.wangji92.arthas.plugin.demo.controller.StaticTest * '{params,returnObj,throwExp,target.filedValue}' -n 5 -x 3 'method.initMethod(),method.constructor!=null || [email protected]@isStatic(method.method.getModifiers())'

El valor del elemento de configuración seleccionado springContext.getEnvironment () (esto es para configurar un contexto de resorte estático ver el documento de uso

ognl -x 3 '#springContext=@com.wangji92.arthas.plugin.demo.common.ApplicationContextProvider@context,#springContext.getEnvironment().getProperty("custom.name")' -c e374b99

Obtenga los valores de todos los elementos de configuración. También es posible obtener el contexto del resorte tt y estático por reloj. El mismo principio


watch -x 3 -n 1  org.springframework.web.servlet.DispatcherServlet doDispatch '#springContext=@org.springframework.web.context.support.WebApplicationContextUtils@getWebApplicationContext(params[0].getServletContext()),#allProperties={},#standardServletEnvironment=#propertySourceIterator=#springContext.getEnvironment(),#propertySourceIterator=#standardServletEnvironment.getPropertySources().iterator(),#propertySourceIterator.{#key=#this.getName(),#allProperties.add("                "),#allProperties.add("------------------------- name:"+#key),#this.getSource() instanceof java.util.Map ?#this.getSource().entrySet().iterator.{#key=#this.key,#allProperties.add(#key+"="+#standardServletEnvironment.getProperty(#key))}:#{}},#allProperties'

Dirección del complemento: https://plugins.jetbrains.com/plugin/13581-arthas-idea
Arthas está llevando a cabo oficialmente un evento de ensayo, si tiene

  • Problemas comprobados con Arthas
  • Interpretación del código fuente de Arthas
  • Sugerencias para Arthas
  • Ilimitado, otro contenido relacionado con Arthas

Bienvenido a participar en la actividad de ensayo, y hay premios para obtener ~
¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará?  ¡Aquí viene la mejor práctica!
Haga clic para leer el texto original para acceder a la dirección de la actividad de ensayo.

Tiempo de bienestar

TIEMPO DE REGALO

La comunidad técnica de Arthas patrocinó especialmente parte de los obsequios (1 altavoz Bluetooth, 10 bolas de descompresión con forma de cerebro) de esta actividad de ensayo para los lectores de Hollis.

Este obsequio no necesita ser comentado ni reenviado
mediante el método de lotería más justo.
No hay preocupación pública: el programador entrevista al
¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará?  ¡Aquí viene la mejor práctica!
número público en el lugar entre bastidores Re: Ensayo
para participar en el sorteo
¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará?  ¡Aquí viene la mejor práctica!
de Java 329: ¿Qué comando para monitorear el estado de las máquinas virtuales que ejecutan una variedad de información?
Problema de simultaneidad en profundidad 013: Ampliación de la optimización de bloqueo sincronizado
¿La herramienta de verificación de problemas de código abierto de Alibaba no funcionará?  ¡Aquí viene la mejor práctica!
Si le gusta este artículo,
mantenga presionado el código QR y siga a Hollis.

Reenviar al círculo de amigos es mi mayor apoyo.

Un punto que parece
una sensación de
ver un apoyo
↘↘↘

Supongo que te gusta

Origin blog.51cto.com/13626762/2544073
Recomendado
Clasificación