Diferencia entre revisiones de «Depuración: LogCat»

De MediaWiki
Ir a la navegación Ir a la búsqueda
(Página creada con «==Introdución== *Unha das técnicas para realizar depuración e seguimento das aplicacións é a creación de logs (rexistros) en tempo de execución. *En Android úsase a...»)
 
 
(No se muestran 3 ediciones intermedias del mismo usuario)
Línea 1: Línea 1:
 
==Introdución==
 
==Introdución==
 +
 +
* Máis información [https://developer.android.com/studio/debug/am-logcat?hl=es-419 neste enlace].
 +
 +
 
*Unha das técnicas para realizar depuración e seguimento das aplicacións é a creación de logs (rexistros) en tempo de execución.
 
*Unha das técnicas para realizar depuración e seguimento das aplicacións é a creación de logs (rexistros) en tempo de execución.
 
*En Android úsase a clase '''Log''', que posúe un conxunto de métodos estáticos que nos van axudar no proceso de depuración/seguimento.
 
*En Android úsase a clase '''Log''', que posúe un conxunto de métodos estáticos que nos van axudar no proceso de depuración/seguimento.
  
−
[[Image:Android_2014_U4_01_Depuracion_01.jpg|700px]]
+
[[Image:PDM_Debugger_1.jpg|600px]]
−
*A imaxe amosa un conxunto de mensaxes que teñen, entre outros, os seguintes campos.
+
 
−
**Nivel de criticidade: tipo de mensaxe (Erro, Warning, INfo, Debug, etc)
+
 
−
**PID: Código do proceso que produciu a mensaxe.
+
 
−
**Tag: Etiqueta que axuda á identificación da mensaxe, moi útil para filtrar resultados.
+
<br />
−
**Mensaxe
+
*A imaxe amosa un conxunto de mensaxes. Os campos que conforman a mensaxe se poden escoller como se amosa na seguinte imaxe:
 +
[[Image:PDM_Debugger_1b.jpg|500px]]
 +
 
 +
* As mensaxes poden ter diferente cor en función do nivel de gravidade, así estarán en vermello os que sexan de tipo '''Error'''.
 +
**Nivel de criticidade: tipo de mensaxe (Erro, Warning, Info, Debug, etc)
  
  
Línea 19: Línea 27:
  
 
==Caso práctico==
 
==Caso práctico==
−
*Crear o seguinte proxecto: '''U4_01_Depuracion'''
+
*Crear o seguinte proxecto: '''Depuracion'''
 +
: Unha activity de nome 'Practica_1'
 +
 
 +
 
 
*Imos realizar un pequeno proxecto onde amosamos como poder usar o LOG.
 
*Imos realizar un pequeno proxecto onde amosamos como poder usar o LOG.
−
*A etiqueta que se está usando no programa é: "DEPURACIÓN"
+
*A etiqueta ('''tag''') que se está usando no programa é: "DEPURACIÓN"
−
*E estamos usando un filtro para ver só as etiquetas con ese nome.
+
 
−
*Para ver as mensaxes de log usaremos a ventá '''LogCat''' que está tanto na perspectiva Java como DDMS.
+
*Para ver as mensaxes de log usaremos a ventá '''LogCat'''.
  
 
<gallery caption="Depuración" widths="350" heights="300px" perrow="2">
 
<gallery caption="Depuración" widths="350" heights="300px" perrow="2">
−
Image:Android_2014_U4_01_Depuracion_03.jpg|Lanzamos a aplicación  
+
Image:PDM_Debugger_2.jpg| Ao iniciar a aplicación (o código está posto a continuación) aparecerán mensaxes cos diferentes  niveis de criticidade.<br>Estas foron creadas dentro do método onCreate().
−
Image:Android_2014_U4_01_Depuracion_02.jpg|E no LogCat amosa unha serie de mensaxes con distintos niveis de criticidade.<br>Estas foron creadas dentro do método onCreate().
+
Image:PDM_Debugger_3.jpg| Escribimos un valor correcto na aplicación.
−
Image:Android_2014_U4_01_Depuracion_04.jpg|Escribimos un valor correcto
+
PDM_Debugger_4.jpg| No logcat podemos buscar por parte do texto da mensaxe, polo que buscamos polo tag. Vemos por anda a aplicación ...
−
Image:Android_2014_U4_01_Depuracion_05.jpg|E no LogCat vemos por anda a aplicación ...
+
PDM_Debugger_5.jpg| Escribimos un valor incorrecto
−
Image:Android_2014_U4_01_Depuracion_06.jpg|Escribimos un valor incorrecto
+
PDM_Debugger_6.jpg| E volvemos ver por onde anda a aplicación...
−
Image:Android_2014_U4_01_Depuracion_07.jpg|E volvemos ver por onde anda a aplicación ...
 
 
</gallery>
 
</gallery>
  
 +
 +
 +
 +
<br />
 
===O XML do Layout===
 
===O XML do Layout===
 
*A continuación amósase o Layout da aplicación:
 
*A continuación amósase o Layout da aplicación:
  
−
<syntaxhighlight lang="xml" line enclose="div" highlight="13,19" >
+
<syntaxhighlight lang="xml" line enclose="div" highlight="10,22,30" >
−
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+
<?xml version="1.0" encoding="utf-8"?>
 +
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 +
    xmlns:app="http://schemas.android.com/apk/res-auto"
 
     xmlns:tools="http://schemas.android.com/tools"
 
     xmlns:tools="http://schemas.android.com/tools"
 
     android:layout_width="match_parent"
 
     android:layout_width="match_parent"
 
     android:layout_height="match_parent"
 
     android:layout_height="match_parent"
−
    android:orientation="vertical"
+
     tools:context=".Practica_1">
−
     tools:context="com.example.u4_01_depuracion.U4_01_Depuracion" >
 
  
 
     <EditText
 
     <EditText
−
         android:id="@+id/et"
+
         android:id="@+id/edtSeculo"
 
         android:layout_width="wrap_content"
 
         android:layout_width="wrap_content"
 
         android:layout_height="wrap_content"
 
         android:layout_height="wrap_content"
−
         android:hint="Introduce o século no que vives"
+
         android:layout_marginStart="8dp"
−
         android:inputType="number" />
+
        android:layout_marginTop="8dp"
 +
        android:ems="10"
 +
         android:inputType="textPersonName"
 +
        app:layout_constraintStart_toStartOf="parent"
 +
        app:layout_constraintTop_toTopOf="parent"
 +
        tools:text="Introduce o século onde vives" />
  
 
     <Button
 
     <Button
 +
        android:id="@+id/btnPremer"
 
         android:layout_width="wrap_content"
 
         android:layout_width="wrap_content"
 
         android:layout_height="wrap_content"
 
         android:layout_height="wrap_content"
 +
        android:layout_marginStart="8dp"
 +
        android:layout_marginTop="8dp"
 
         android:text="Preme aquí"
 
         android:text="Preme aquí"
−
         android:onClick="onButtonClick" />
+
        app:layout_constraintStart_toStartOf="parent"
 +
        app:layout_constraintTop_toBottomOf="@+id/edtSeculo"
 +
         android:onClick="onButtonClick"
 +
        />
 +
</android.support.constraint.ConstraintLayout>
 +
</syntaxhighlight>
 +
 
  
−
</LinearLayout>
 
−
</syntaxhighlight>
 
  
  
  
 +
<br />
 
===O código Java da aplicación===
 
===O código Java da aplicación===
  
 +
* '''Nota:''' Comprobar que o nome do paquete coincida có do voso proxecto.
  
−
<syntaxhighlight lang="java" line enclose="div" highlight="18-22,38,42,48" >
+
 
−
package com.example.u4_01_depuracion;
+
<syntaxhighlight lang="java" line enclose="div" highlight="17,21,27,38-42" >
 +
package es.cifprodofloucha.angel.depuracion.depuracion;
  
 
import android.app.Activity;
 
import android.app.Activity;
 
import android.os.Bundle;
 
import android.os.Bundle;
 
import android.util.Log;
 
import android.util.Log;
−
import android.view.Menu;
 
−
import android.view.MenuItem;
 
 
import android.view.View;
 
import android.view.View;
 
import android.widget.EditText;
 
import android.widget.EditText;
 
import android.widget.Toast;
 
import android.widget.Toast;
  
−
public class U4_01_Depuracion extends Activity {
+
public class Practica_1 extends Activity {
−
 
 
−
@Override
 
−
protected void onCreate(Bundle savedInstanceState) {
 
−
super.onCreate(savedInstanceState);
 
−
setContentView(R.layout.activity_u4_01__depuracion);
 
−
Log.e("DEPURACIÓN", "Mensaxe de erro");
 
−
Log.w("DEPURACIÓN", "Mensaxe de aviso");
 
−
Log.i("DEPURACIÓN", "Mensaxe de información");
 
−
Log.d("DEPURACIÓN", "Mensaxe de mensaxe de depuración");
 
−
Log.v("DEPURACIÓN", "Mensaxe de vervose");
 
  
−
}
+
    public void onButtonClick(View v) {
 +
        EditText et = (EditText) findViewById(R.id.edtSeculo);
  
−
@Override
+
        if (et.getText().toString().equals("21")) {
−
public boolean onCreateOptionsMenu(Menu menu) {
+
            Toast.makeText(this, "Tes os pes na terra ", Toast.LENGTH_SHORT).show();
−
// Inflate the menu; this adds items to the action bar if it is present.
+
            Log.i("DEPURACIÓN BOTÓN", "Dentro if");
−
getMenuInflater().inflate(R.menu.u4_01__depuracion, menu);
 
−
return true;
 
−
}
 
  
−
public void onButtonClick(View v) {
+
        } else if (et.getText().toString().equals("")) {
−
EditText et = (EditText) findViewById(R.id.et);
+
            Toast.makeText(this, "Non escribiches nada", Toast.LENGTH_SHORT).show();
 +
            Log.i("DEPURACIÓN BOTÓN", "Dentro else if");
  
−
if (et.getText().toString().equals("21")) {
+
        } else
−
Toast.makeText(this, "Tes os pes na terra ", Toast.LENGTH_SHORT).show();
 
−
Log.i("DEPURACIÓN BOTÓN", "Dentro if");
 
  
−
} else if (et.getText().toString().equals("")) {
+
        {
−
Toast.makeText(this, "Non escribiches nada", Toast.LENGTH_SHORT).show();
+
            Toast.makeText(this, "Estás noutro planeta", Toast.LENGTH_SHORT).show();
−
Log.i("DEPURACIÓN BOTÓN", "Dentro else if");
+
            Log.i("DEPURACIÓN BOTÓN", "Dentro else");
  
−
} else
+
        }
  
−
{
+
    }
−
Toast.makeText(this, "Estás noutro planeta", Toast.LENGTH_SHORT).show();
 
−
Log.i("DEPURACIÓN BOTÓN", "Dentro else");
 
  
−
}
+
    @Override
 +
    protected void onCreate(Bundle savedInstanceState) {
 +
        super.onCreate(savedInstanceState);
 +
        setContentView(R.layout.activity_practica_1);
  
−
}
+
        Log.e("DEPURACIÓN", "Mensaxe de erro");
 +
        Log.w("DEPURACIÓN", "Mensaxe de aviso");
 +
        Log.i("DEPURACIÓN", "Mensaxe de información");
 +
        Log.d("DEPURACIÓN", "Mensaxe de mensaxe de depuración");
 +
        Log.v("DEPURACIÓN", "Mensaxe de vervose");
  
 +
    }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
−
*'''Liñas 18-22''': A aplicación emite mensaxes a través dos métodos estáticos con distintos niveis de criticidade.
+
*'''Liñas 38-42''': A aplicación emite mensaxes a través dos métodos estáticos con distintos niveis de criticidade.
 
**A etiqueta (tag) é o primeiro campo.
 
**A etiqueta (tag) é o primeiro campo.
−
*'''Liñas 38,42,48''': emisión de mensaxes que nos axudan a saber porque parte do código se atopa a aplicación.
+
*'''Liñas 17,21,27''': emisión de mensaxes que nos axudan a saber porque parte do código se atopa a aplicación.
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
  
  
−
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2015).
+
<br> -- [[Usuario:angelfg|Ángel D. Fernández González]] e [[Usuario:Carrion|Carlos Carrión Álvarez]] -- (2018).

Revisión actual del 17:36 22 sep 2019

Introdución


  • Unha das técnicas para realizar depuración e seguimento das aplicacións é a creación de logs (rexistros) en tempo de execución.
  • En Android úsase a clase Log, que posúe un conxunto de métodos estáticos que nos van axudar no proceso de depuración/seguimento.

PDM Debugger 1.jpg



  • A imaxe amosa un conxunto de mensaxes. Os campos que conforman a mensaxe se poden escoller como se amosa na seguinte imaxe:

PDM Debugger 1b.jpg

  • As mensaxes poden ter diferente cor en función do nivel de gravidade, así estarán en vermello os que sexan de tipo Error.
    • Nivel de criticidade: tipo de mensaxe (Erro, Warning, Info, Debug, etc)


  • Para cada nivel de criticidade existe un método estático que nós axuda a clasificar as mensaxes que pode producir a aplicación: e(), w(), i(), d() e v().
  • Cada un dos métodos recibe como parámetro a etiqueta (tag) e o texto da mensaxe.


Caso práctico

  • Crear o seguinte proxecto: Depuracion
Unha activity de nome 'Practica_1'


  • Imos realizar un pequeno proxecto onde amosamos como poder usar o LOG.
  • A etiqueta (tag) que se está usando no programa é: "DEPURACIÓN"
  • Para ver as mensaxes de log usaremos a ventá LogCat.




O XML do Layout

  • A continuación amósase o Layout da aplicación:
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     tools:context=".Practica_1">
 8 
 9     <EditText
10         android:id="@+id/edtSeculo"
11         android:layout_width="wrap_content"
12         android:layout_height="wrap_content"
13         android:layout_marginStart="8dp"
14         android:layout_marginTop="8dp"
15         android:ems="10"
16         android:inputType="textPersonName"
17         app:layout_constraintStart_toStartOf="parent"
18         app:layout_constraintTop_toTopOf="parent"
19         tools:text="Introduce o século onde vives" />
20 
21     <Button
22         android:id="@+id/btnPremer"
23         android:layout_width="wrap_content"
24         android:layout_height="wrap_content"
25         android:layout_marginStart="8dp"
26         android:layout_marginTop="8dp"
27         android:text="Preme aquí"
28         app:layout_constraintStart_toStartOf="parent"
29         app:layout_constraintTop_toBottomOf="@+id/edtSeculo"
30         android:onClick="onButtonClick"
31         />
32 </android.support.constraint.ConstraintLayout>




O código Java da aplicación

  • Nota: Comprobar que o nome do paquete coincida có do voso proxecto.


 1 package es.cifprodofloucha.angel.depuracion.depuracion;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.util.Log;
 6 import android.view.View;
 7 import android.widget.EditText;
 8 import android.widget.Toast;
 9 
10 public class Practica_1 extends Activity {
11 
12     public void onButtonClick(View v) {
13         EditText et = (EditText) findViewById(R.id.edtSeculo);
14 
15         if (et.getText().toString().equals("21")) {
16             Toast.makeText(this, "Tes os pes na terra ", Toast.LENGTH_SHORT).show();
17             Log.i("DEPURACIÓN BOTÓN", "Dentro if");
18 
19         } else if (et.getText().toString().equals("")) {
20             Toast.makeText(this, "Non escribiches nada", Toast.LENGTH_SHORT).show();
21             Log.i("DEPURACIÓN BOTÓN", "Dentro else if");
22 
23         } else
24 
25         {
26             Toast.makeText(this, "Estás noutro planeta", Toast.LENGTH_SHORT).show();
27             Log.i("DEPURACIÓN BOTÓN", "Dentro else");
28 
29         }
30 
31     }
32 
33     @Override
34     protected void onCreate(Bundle savedInstanceState) {
35         super.onCreate(savedInstanceState);
36         setContentView(R.layout.activity_practica_1);
37 
38         Log.e("DEPURACIÓN", "Mensaxe de erro");
39         Log.w("DEPURACIÓN", "Mensaxe de aviso");
40         Log.i("DEPURACIÓN", "Mensaxe de información");
41         Log.d("DEPURACIÓN", "Mensaxe de mensaxe de depuración");
42         Log.v("DEPURACIÓN", "Mensaxe de vervose");
43 
44     }
45 }
  • Liñas 38-42: A aplicación emite mensaxes a través dos métodos estáticos con distintos niveis de criticidade.
    • A etiqueta (tag) é o primeiro campo.
  • Liñas 17,21,27: emisión de mensaxes que nos axudan a saber porque parte do código se atopa a aplicación.






-- Ángel D. Fernández González e Carlos Carrión Álvarez -- (2018).