flutter11 - Depurador

flutter11 - Depurador

En este artículo se reimprime de: aleteo de combate (DU ed)

analizador de dardo

Antes de ejecutar la aplicación, ejecute la flutter analyzeprueba de su código. Esta herramienta es una herramienta de comprobación de código estático, es dartanalyzerun paquete de herramientas, que se utiliza principalmente para analizar código y ayudar a los desarrolladores detectar posibles errores, por ejemplo, Dardo analizador de amplio uso de los comentarios tipo en el código de seguimiento ayuda por el problema y evitar var, parámetros sin tipo, sin tipo de lista de texto.

Si utiliza aleteo IntelliJ plug-ins, a continuación, cuando se abre el analizador de IDE se ha activado automáticamente, y si los lectores están utilizando otro IDE, que el lector se recomienda encarecidamente analizador de dardo, porque la mayoría de las veces, DART puede ejecutar el analizador de código encontrado hace que la mayoría de los problemas.

Observatorio de dardos (sentencia de nivel depuración paso a paso y el analizador)

Si usamos flutter runpara iniciar la aplicación, a continuación, cuando se está ejecutando, podemos abrir las herramientas del Observatorio de las páginas web, tales como la escucha Observatorio http://127.0.0.1:8100/ predeterminada, puede abrir el enlace directamente en el navegador. El uso directo de nivel de declaración de un solo paso depurador conectado a su aplicación. Si está utilizando IntelliJ, también puede utilizar su base de depurador para depurar la aplicación.

Observatorio también soporta análisis, verificación montón y así sucesivamente. Para obtener más información, consulte Observatorio documentación Observatorio .

Si utiliza Observatorio para el análisis, asegúrese de que la --profileopción de ejecución flutter runde comandos para ejecutar la aplicación. De lo contrario, el principal problema en el archivo de configuración aparecerá en la aserción de depuración en varios marco de validación invariantes (ver "modo de depuración afirmación" a continuación).

debugger() declaración

Cuando dardo Observatorio (Dardo u otros depuradores, como un depurador en IntelliJ IDE), puede utilizar la debugger()declaración para insertar un punto de interrupción mediante programación. Para usar esto, hay que añadir import 'dart:developer';a la parte superior de los documentos pertinentes.

debugger()Afirmación adquiere una opción whende parámetros, puede especificar este parámetro es cierto interrumpida sólo bajo ciertas condiciones, de la siguiente manera:

void someFunction(double offset) {
  debugger(when: offset > 30.0);
  // ...
}

print, debugPrint,flutter logs

Dardo print()de salida también disponible para la consola del sistema, se puede utilizar flutter logspara visualizarla (básicamente un paquete adb logcat).

Si una vez salida demasiado, entonces Android veces descartar alguna línea de registro. Para evitar esto, se puede utilizar el aleteo de la foundationbiblioteca debugPrint(). Imprimir este es un paquete, se limitará la salida a un nivel para evitar ser desechado kernel Android.

marco aleteo en muchas de las clases han toStringlogrado. Convencionalmente, estas salidas incluyen típicamente objeto runtimeTypede salida única línea, por lo general NombreClase (más información sobre este ejemplo ... ) en el formulario. Algunas clases también se utiliza en el árbol toStringDeep, se describe todo el punto de retorno subárbol partir de la pluralidad de filas. Algunos detalles han sido toStringclase se dará cuenta de un toStringShortsimplemente devuelve el tipo de objeto o de otro muy breve (una o dos palabras) Descripción.

el modo de depuración de aserción

En la depuración de aplicaciones trémolo, Dardo assertdeclaración está activado y el uso marco del alboroto que éste realice muchos de los controles de tiempo de ejecución para verificar si una violación de alguna regla inmutable.

Cuando se viola una regla inmutable, se informa a la consola, y con un número de información contextual para ayudar a rastrear la raíz del problema.

Para desactivar el modo de depuración y utilizar el modo de liberación, utilice flutter run --releasepara ejecutar su aplicación. También cierra el depurador Observatorio. Un modo intermedio puede desactivar todos excepto ayudas de depuración observatorio, conocidos como "modo de perfil", con --profileuna alternativa --releasea.

Depurar la capa de aplicación

Cada marco Flutter capa proporciona su estado o evento actual de volcado (dump) a la consola (usando la debugPrintfunción).

Árbol Widget

Para volcar el estado de los widgets de árboles, por favor llame debugDumpApp(). Mientras que la aplicación ha sido construido al menos una vez (es decir, llamar build()en cualquier momento después), no se puede estar en la fase de construcción (es decir, no en la aplicación build()en cualquier momento para llamar en el método) Este método se llama (llama runApp()después).

Por ejemplo, la aplicación:

import 'package:flutter/material.dart';

void main() {
  runApp(
    new MaterialApp(
      home: new AppHome(),
    ),
  );
}

class AppHome extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Material(
      child: new Center(
        child: new FlatButton(
          onPressed: () {
            debugDumpApp();
          },
          child: new Text('Dump App'),
        ),
      ),
    );
  }
}

... es salida de dicho contenido (los detalles precisos versión marco, el tamaño del aparato y similares varían dependiendo):

I/flutter ( 6559): WidgetsFlutterBinding - CHECKED MODE
I/flutter ( 6559): RenderObjectToWidgetAdapter<RenderBox>([GlobalObjectKey RenderView(497039273)]; renderObject: RenderView)
I/flutter ( 6559): └MaterialApp(state: _MaterialAppState(1009803148))
I/flutter ( 6559):  └ScrollConfiguration()
I/flutter ( 6559):   └AnimatedTheme(duration: 200ms; state: _AnimatedThemeState(543295893; ticker inactive; ThemeDataTween(ThemeData(Brightness.light Color(0xff2196f3) etc...) → null)))
I/flutter ( 6559):    └Theme(ThemeData(Brightness.light Color(0xff2196f3) etc...))
I/flutter ( 6559):     └WidgetsApp([GlobalObjectKey _MaterialAppState(1009803148)]; state: _WidgetsAppState(552902158))
I/flutter ( 6559):      └CheckedModeBanner()
I/flutter ( 6559):       └Banner()
I/flutter ( 6559):        └CustomPaint(renderObject: RenderCustomPaint)
I/flutter ( 6559):         └DefaultTextStyle(inherit: true; color: Color(0xd0ff0000); family: "monospace"; size: 48.0; weight: 900; decoration: double Color(0xffffff00) TextDecoration.underline)
I/flutter ( 6559):          └MediaQuery(MediaQueryData(size: Size(411.4, 683.4), devicePixelRatio: 2.625, textScaleFactor: 1.0, padding: EdgeInsets(0.0, 24.0, 0.0, 0.0)))
I/flutter ( 6559):           └LocaleQuery(null)
I/flutter ( 6559):            └Title(color: Color(0xff2196f3))
... #省略剩余内容

Se trata de un "aplanamiento" de los espectáculos árbol todas proyección Reproductor construido por varias funciones (si se llama en las raíces de los árboles de widgets toStringDeepwidget, este es el árbol que obtienes). Verá un montón de Reproductor no aparece en el código fuente de la aplicación, ya que están en el marco del widget build()función de inserción. Por ejemplo, InkFeatureun material widget de detalles de implementación.

Cuando se pulsa el botón de la debugDumpApp cambiado es liberado () se llama, FlatButton objetos simultáneamente llamando setState()y su propia marca como "sucio". Es por eso que si nos fijamos en el vertedero, verá específica objetos marcados como "sucio". También se puede ver lo que ha sido registrada gesto oyente; en este caso, un solo GestureDetector aparece, y escuchar "toque" gesto ( "toque" es TapGestureDetectoruna toStringShortfunción de la salida)

Si escribe su propio widget, puede cubrir debugFillProperties()para añadir información. El DiagnosticsProperty el objeto como un parámetro, y llamar al método de la clase padre. Esta función es la toStringmétodo utilizado para llenar una pequeña parte de la descripción.

render Árbol

Si trata de un problema de diseño de depuración, árbol Widget podría no lo suficientemente detallada. En este caso, se puede llamar debugDumpRenderTree()el render volcado árbol. Del mismo modo que debugDumpApp(), además de la etapa de diseño o dibujo, puede llamar a esta función en cualquier momento. Como regla general, de la devolución de llamada marco de llamada o controlador de eventos es la mejor solución.

A la llamada debugDumpRenderTree(), es necesario agregar import'package:flutter/rendering.dart';a su archivo de origen.

La salida por encima de este pequeño ejemplo se muestra a continuación:

I/flutter ( 6559): RenderView
I/flutter ( 6559):  │ debug mode enabled - android
I/flutter ( 6559):  │ window size: Size(1080.0, 1794.0) (in physical pixels)
I/flutter ( 6559):  │ device pixel ratio: 2.625 (physical pixels per logical pixel)
I/flutter ( 6559):  │ configuration: Size(411.4, 683.4) at 2.625x (in logical pixels)
I/flutter ( 6559):  │
I/flutter ( 6559):  └─child: RenderCustomPaint
I/flutter ( 6559):    │ creator: CustomPaint ← Banner ← CheckedModeBanner ←
I/flutter ( 6559):    │   WidgetsApp-[GlobalObjectKey _MaterialAppState(1009803148)] ←
I/flutter ( 6559):    │   Theme ← AnimatedTheme ← ScrollConfiguration ← MaterialApp ←
I/flutter ( 6559):    │   [root]
I/flutter ( 6559):    │ parentData: <none>
I/flutter ( 6559):    │ constraints: BoxConstraints(w=411.4, h=683.4)
I/flutter ( 6559):    │ size: Size(411.4, 683.4)
... # 省略

Esta es la raíz RenderObjectobjeto toStringDeepfunción de salida.

Al depurar problemas de diseño, la clave es mirar sizey constraintscampos. Restricción baja por el árbol, el tamaño pasar.

Si usted escribe sus propios objetos de representación, se puede cubrir mediante debugFillProperties()la adición a la basura. El DiagnosticsProperty objeto como un método de parámetros, y llamar al método de la clase padre.

estrato arbóreo

Los lectores pueden entenderse como el árbol de render es jerárquica, y, finalmente, tendrán que elaborar la síntesis de diferentes capas, mientras que se requiere cuando la capa capa de pintura sintética, si se intenta problema de síntesis de depuración, se puede utilizar debugDumpLayerTree(). Para el ejemplo anterior, se dará salida:

I/flutter : TransformLayer
I/flutter :  │ creator: [root]
I/flutter :  │ offset: Offset(0.0, 0.0)
I/flutter :  │ transform:
I/flutter :  │   [0] 3.5,0.0,0.0,0.0
I/flutter :  │   [1] 0.0,3.5,0.0,0.0
I/flutter :  │   [2] 0.0,0.0,1.0,0.0
I/flutter :  │   [3] 0.0,0.0,0.0,1.0
I/flutter :  │
I/flutter :  ├─child 1: OffsetLayer
I/flutter :  │ │ creator: RepaintBoundary ← _FocusScope ← Semantics ← Focus-[GlobalObjectKey MaterialPageRoute(560156430)] ← _ModalScope-[GlobalKey 328026813] ← _OverlayEntry-[GlobalKey 388965355] ← Stack ← Overlay-[GlobalKey 625702218] ← Navigator-[GlobalObjectKey _MaterialAppState(859106034)] ← Title ← ⋯
I/flutter :  │ │ offset: Offset(0.0, 0.0)
I/flutter :  │ │
I/flutter :  │ └─child 1: PictureLayer
I/flutter :  │
I/flutter :  └─child 2: PictureLayer

Esta es la raíz Layerde la toStringDeepsalida.

transformación de la raíz es una relación de transformación del pixel de las aplicaciones, en este caso, cada píxel representa 3,5 pixel dispositivo lógico.

RepaintBoundaryobjetos que se crea una representación del estrato arbóreo RenderRepaintBoundary. Esto se utiliza para reducir la necesidad de volver a dibujar la demanda.

semántico

También puede llamar a debugDumpSemanticsTree()adquirir árbol semántico (presentada API de accesibilidad del árbol para el sistema) volcado. Para utilizar esta función, primero debe activar las funciones de accesibilidad, como la activación del sistema o ayudas SemanticsDebugger(véase más adelante).

Para el ejemplo anterior, se dará salida:

I/flutter : SemanticsNode(0; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4))
I/flutter :  ├SemanticsNode(1; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4))
I/flutter :  │ └SemanticsNode(2; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4); canBeTapped)
I/flutter :  └SemanticsNode(3; Rect.fromLTRB(0.0, 0.0, 411.4, 683.4))
I/flutter :    └SemanticsNode(4; Rect.fromLTRB(0.0, 0.0, 82.0, 36.0); canBeTapped; "Dump App")

despacho

Para saber en relación con la posición de comienzo de trama / final del evento, se puede cambiar debugPrintBeginFrameBannery debugPrintEndFrameBannervalores booleanos para iniciar y marcos de los extremos impresa en la consola.

Por ejemplo:

I/flutter : ▄▄▄▄▄▄▄▄ Frame 12         30s 437.086ms ▄▄▄▄▄▄▄▄
I/flutter : Debug print: Am I performing this work more than once per frame?
I/flutter : Debug print: Am I performing this work more than once per frame?
I/flutter : ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀

debugPrintScheduleFrameStacksTambién se puede utilizar para imprimir los resultados en el marco de pila llamada actual a ser programado.

depurador de visual

También puede configurar debugPaintSizeEnabledpara truedepurar problemas de diseño visual. Se deriva de renderingbiblioteca valor booleano. Se puede activar en cualquier momento, e influir en la pintura es cierto. La manera más fácil de lo sitúan en void main()la parte superior del conjunto.

Cuando está activado, todas las cajas tendrán un brillante frontera azul profundo, el relleno (por ejemplo, de un relleno Widget) se muestra como azul claro, un niño Reproductor rodeado por la caja de color azul oscuro, la alineación (por ejemplo de un widget y el Centro Alinear) se muestra en la flecha de color amarillo. en blanco (por ejemplo, sin ningún tipo de nodos hijos de contenedores) se muestran en gris.

debugPaintBaselinesEnabledHacemos una cosa similar, pero para un objeto con la línea de base, la línea de base que se muestran en el texto en verde, ideográfico (ideográfico) de referencia se muestra en naranja.

debugPaintPointersEnabledAbra la muestra un modo especial, haga clic en cualquiera de los objetos se están resaltados en verde azulado. Esto puede ayudar a determinar si un objeto es incorrecta de alguna manera hit prueba (posición aleteo detecta si un clic de control puede responder a las acciones del usuario), por ejemplo, si es realmente más allá del alcance de su padre, primero no va a ser considerada por la prueba de posicionamiento.

Si se intenta depurar una capa sintética, por ejemplo, para determinar si y dónde agregar un RepaintBoundarywidget, puede utilizar la debugPaintLayerBordersEnabledbandera que marcaba el límite de cada capa con naranja o contornos, o el uso de debugRepaintRainbowEnabledseñales, siempre y cuando vuelven a dibujar, esta esta capa estaría cubierto por un conjunto de color de rotación.

Todos estos signos sólo pueden funcionar en modo de depuración. Por lo general, el aleteo marco para " debug..." principio nada sólo puede funcionar en modo de depuración.

depuración de Animación

La forma más fácil de depurar la animación es aminore su velocidad. Para este propósito, establecer timeDilationlas variables (en la base de datos scheduler) a un número mayor que 1,0, por ejemplo, 50,0. El mejor conjunto sólo una vez cuando se inicia la aplicación. Si lo cambia sobre la marcha, sobre todo en las carreras de animación cuando su valor es poco a poco, se puede producir un retroceso en la observación, lo que puede causar una aserción éxitos, y esto se suele interferir con nuestro trabajo de desarrollo.

Depurar problemas de rendimiento

Para comprender la causa de su aplicación a la re-diseño o volver a dibujar, se puede configurar por separado debugPrintMarkNeedsLayoutStacksy debugPrintMarkNeedsPaintStacksbanderas. Siempre que se requiera el cartucho que volver a hacer el diseño y re-dibujado, que hará un seguimiento de la pila a la consola. Si este método es útil para usted, usted puede utilizar la servicesbiblioteca de debugPrintStack()método de impresión bajo demanda seguimientos de pila.

la aplicación Estadística, el tiempo de arranque

Para reunir más información sobre el tiempo de aplicación del alboroto necesario para iniciar, puede ejecutar flutter runutilizando el tiempo trace-startupy profileopciones.

$ flutter run --trace-startup --profile

salida de rastreo se almacena start_up_info.jsonen el directorio del alboroto proyecto en el directorio de construcción. La salida de la lista de aplicaciones para iniciar el seguimiento de estos eventos (en microsegundos) Tiempo de captura:

  • Aleteo en el motor.
  • Cuando la aplicación primero de visualización de tramas.
  • marco de la inicialización del alboroto.
  • Al finalizar la inicialización del alboroto marco.

Tales como:

{
  "engineEnterTimestampMicros": 96025565262,
  "timeToFirstFrameMicros": 2171978,
  "timeToFrameworkInitMicros": 514585,
  "timeAfterFrameworkInitMicros": 1657393
}

Dardo rendimiento del código de seguimiento

Para ejecutar pared auto / tiempo de la CPU se define y se mide el seguimiento del dardo segmentos de código arbitrario rendimiento (similar a la utilizada en el Android systrace ). El uso de dart:developerla línea de tiempo herramienta para contener bloques de código que desea probar, por ejemplo:

Timeline.startSync('interesting function');
// iWonderHowLongThisTakes();
Timeline.finishSync();

Observatorio línea de tiempo y abra la página de su solicitud, seleccione 'dardo' en la casilla de verificación "flujos grabados", y llevar a cabo la función que se desea medir.

Chrome se actualiza la página en una herramienta de seguimiento para el registro de aplicaciones de visualización de línea de tiempo en orden cronológico.

Asegúrese de ejecutar flutter runcon un tiempo de --profilepabellón para garantizar que las características de rendimiento de tiempo de ejecución con diferencias mínimas en el producto final.

Publicado 49 artículos originales · ganado elogios 6 · Vistas a 80000 +

Supongo que te gusta

Origin blog.csdn.net/zlhyy666666/article/details/104926046
Recomendado
Clasificación