Xcode y depuración avanzada en LLDB: parte 2

Buenas tardes, hoy les traigo a su atención la segunda parte del artículo sobre depuración de aplicaciones en LLDB.

En la primera parte, descubrimos cómo usar puntos de interrupción en Xcode para modificar las propiedades existentes de las variables y agregar una línea de código a través de comandos de instrucciones.

Creé un proyecto de demostración intencionalmente con algunos errores para descubrir cómo usar diferentes tipos de puntos de interrupción en LLDB para depurar la aplicación.

Si no ha estudiado la primera parte del artículo, es mejor comenzar con él. Permítame recordarle una regla importante de este tutorial: hasta el final de este artículo, no detiene el compilador y no reinicia la aplicación después del primer lanzamiento. Corrige errores durante la ejecución del programa.

Miradores

Entonces, el siguiente error en la aplicación:

3. Puede cargar publicaciones más de 7 veces.

Cómo reproducir el error:

  • Encienda Internet en su iPhone / simulador
  • Desplácese hacia abajo hasta el final de la tabla para cargar más publicaciones.
  • Puede cargar publicaciones más de 7 veces (aunque en esta aplicación el usuario no debería tener esa oportunidad).

Como una de las opciones para detectar errores, debe averiguar cómo se actualiza la variable de número entero pageNumber después de cargar nuevas publicaciones en la página. Como todavía no está familiarizado con mi código, debe dedicar un tiempo a comprender lo que sucede en él.

No te preocupes Aplica un poco de magia.

Desde la primera parte del artículo, aprendimos que la solicitud GET HTTP se ejecuta en la sección Redes de la marca pragma . Contiene exactamente una función loadPosts . Coloque un punto de interrupción en la primera línea de esta función y arrastre la tabla hacia abajo para actualizar. El compilador se detendrá en este punto de interrupción.

imagen
Objetivo-c

imagen
Veloz

En la ventana inferior del depurador, haga clic en el botón "Mostrar variables". Aparecerá una nueva ventana a la izquierda, en la que verá todas las variables PostsTableViewController.

imagen

Apunte el cursor a pageNumber, haga clic derecho y seleccione "Watch _pageNumber" / "Watch pageNumber" para Objective-C y Swift, respectivamente.

imagen
Objetivo-c

imagen
Veloz

Por lo tanto, creó el denominado punto de observación para la variable pageNumber. El punto de observación es un tipo de punto de interrupción que detiene el depurador cada vez que cambia el valor de la variable.

imagen
Objetivo-c

imagen
Veloz

Continuar el programa. El depurador se detiene y ve algo como lo siguiente:

Objetivo-c

imagen

  1. Registra los valores antiguos y nuevos de la variable pageNumber .
  2. Seguimiento de una pila de código que cambia el valor de la variable pageNumber .
  3. El punto actual que causó el cambio de la variable pageNumber es el método de establecimiento de esta variable.

Si hace referencia al paso 1 en el seguimiento de la pila, lo llevará al siguiente fragmento de código:

imagen

Veloz

imagen

  1. El depurador le informa que el punto de observación que estableció ha revelado algo.
  2. Seguimiento de una pila de código que cambia el valor de la variable pageNumber .
  3. El punto actual que causó el cambio de la variable pageNumber es la función updateForNetworkCallEnd .

Es lógico concluir que cada vez que se realiza una solicitud HTTP GET exitosa, la variable pageNumber se incrementa en 1 hasta que la variable de estado (del tipo enum) está en el estado "activo". Esta variable puede tener 2 estados: activo ("activo") o inactivo ("inactivo"). El estado "activo" significa que el usuario puede cargar publicaciones (es decir, no se ha alcanzado el límite de 7 descargas). El estado "inactivo", por el contrario, supone que el usuario ya no podrá cargar publicaciones. Como resultado, necesitamos agregar lógica a la función updateForNetworkCallEnd , que verificaría la variable pageNumber y establecería la variable de estado en el estado apropiado.

Como habrás adivinado, es mucho más fácil probar primero la hipótesis sin detener el compilador antes de hacer cambios en el código.

Observo que en la sección Soporte de la marca pragma ya tenemos la función que necesitamos ( setToInactiveState ), que establece la variable de estado en "inactivo".
Agregue un punto de interrupción una línea por encima de la condición if . Agregue también el siguiente comando de instrucciones al depurador.

Objetivo-c

expression if (self.pageNumber >= 7) {[self setToInactiveState]} 

imagen

Veloz

 expression if (self.pageNumber >= 7) {setToInactiveState()} 


imagen

Después de eso, elimine el primer punto de interrupción que utilizó para establecer el punto de observación. También desactive el punto de observación mismo.

imagen
Objetivo-c

imagen
Objetivo-c

imagen
Veloz

imagen
Veloz

Ahora desplácese hacia arriba en las tablas, arrastre hacia abajo para actualizar y comience a voltear.
¡Todo salió bien! Pero es demasiado temprano para celebrar, ¡todavía tenemos un error que solucionar!

Que sigue

La tercera parte final del artículo, en la que aprendemos sobre otro tipo de puntos de interrupción: simbólicos (puntos de interrupción simbólicos).

Source: https://habr.com/ru/post/es432122/


All Articles