Write and View Logs with Logcat

A janela Logcat no Android Studio exibe mensagens do sistema, como quando ocorre uma coleta de lixo, e mensagens que você adicionou ao seu aplicativo com a classe Log. Ele exibe mensagens em tempo real e mantém um histórico para que você possa visualizar mensagens mais antigas.

Para exibir apenas as informações de interesse, você pode criar filtros, modificar como muita informação é exibida nas mensagens, definir níveis de prioridade, exibir mensagens produzidas apenas pelo código da aplicação, e pesquisar o log. Por padrão, o logcatshows mostra a saída de log relacionada apenas com a aplicação mais recentemente executada.

Quando um aplicativo lança uma exceção, o logcat mostra uma mensagem seguida pelo rastreamento da pilha associada contendo links para a linha do código.

As do Android Studio 2.2, a janela Executar também exibe mensagens de log para o aplicativo em execução corrente. Note que você pode configurar a exibição da saída do logcat, mas não a Runwindow.

View your app logs

To display the log messages for an app:

  1. Build and run your app on a device.
  2. Click View > Tool Windows > Logcat (ou clique em Logcat na barra de ferramentas da janela).

A janela Logcat mostra as mensagens de log para a aplicação seleccionada, tal como seleccionado nas listas pendentes no topo da janela, como mostrado na figura 1.

Figure 1. Janela Logcat

Por padrão, o logcat exibe apenas as mensagens de log para a sua aplicação em execução no dispositivo. Para alterar este padrão, veja como filtrar mensagens logcat.

A barra de ferramentas Logcat fornece os seguintes botões:

  1. Limpar logcat : Clique para limpar o log visível.
  2. Rolar para o fim : Clique para saltar para a parte inferior do log e ver as últimas mensagens de log. Se depois clicar numa linha no log, a vista faz uma pausa de rolagem nesse ponto.
  3. Subir o stack trace e descer o stack trace : Clique para navegar para cima e para baixo nos traços de pilha no log, selecionando os nomes de arquivo subseqüentes (e visualizando os números de linha de respeito no editor) que aparecem nas exceções impressas. Este é o mesmo comportamento de quando você clica em um nome de arquivo no log.
  4. Usar soft wraps : Clique para habilitar o empacotamento de linhas e impedir a rolagem horizontal (embora quaisquer cordas inquebráveis ainda necessitem de rolagem horizontal).
  5. Imprimir : Clique para imprimir as mensagens do logcat. Depois de selecionar suas preferências de impressão no diálogo que aparece, você também pode escolher salvar em um PDF.
  6. Reiniciar : Clique para limpar o logcat e reiniciar o logcat. Ao contrário do botão Limpar logcat, este recupera e exibe mensagens de log anteriores, por isso é mais útil se o Logcat ficar sem resposta e não quiser perder as suas mensagens de log.
  7. Cabeçalho Logcat : Clique para abrir o diálogo Configurar Cabeçalho do Logcat, onde pode personalizar a aparência de cada mensagem de logcat, como por exemplo se deve mostrar a data e a hora.
  8. Captura de ecrã : Clique para capturar uma captura de tela.
  9. Registro de tela : Clique para gravar um vídeo do dispositivo (por um máximo de 3 minutos).

Escrever mensagens de log

A classe Log permite-lhe criar mensagens de log que aparecem no logcat. Geralmente, você deve usar os seguintes métodos de log, listados em ordem da maior para a menor prioridade(ou, menos para a maior parte das verbosidades):

  • Log.e(String, String) (erro)
  • Log.w(String, String) (aviso)
  • Log.i(String, String) (informação)
  • Log.d(String, String) (depuração)
  • Log.v(String, String) (verboso)

Veja o Log descrição da classe para uma lista mais completa de opções.

Você nunca deve compilar logs verbosos na sua aplicação, exceto durante o desenvolvimento. Os logs de depuração são compilados mas removidos em tempo de execução, enquanto os logs de erro, aviso e informação são sempre mantidos.

Para cada método de log, o primeiro parâmetro deve ser uma tag única e o parâmetro deste segundo é a mensagem. A tag de uma mensagem de log de sistema é uma pequena string indicando o componente do sistema a partir do qual a mensagem se origina (por exemplo, ActivityManager). Sua tag pode ser qualquer string que você achar útil, como o nome da classe atual.

Uma boa convenção é declarar uma constante TAG na sua classe touse no primeiro parâmetro. Por exemplo, você pode criar uma mensagem de log de informação da seguinte forma:

Kotlin

private const val TAG = "MyActivity"...Log.i(TAG, "MyClass.getView() — get item number $position")

Java

private static final String TAG = "MyActivity";...Log.i(TAG, "MyClass.getView() — get item number " + position);

Nota: nomes de tags maiores que 23 caracteres são truncados na saída do logcat.

Formato de mensagem do logcat

Cada mensagem de log do Android tem uma tag e uma prioridade associada a ela. A tag de uma mensagem de log de sistema é uma pequena string indicando o componente do sistema do qual a mensagem se origina (por exemplo, ActivityManager). Uma tag definida pelo usuário pode ser qualquer string que você achar útil, como o nome da classe atual (a tag recomendada). Você a define em uma chamada de método Log, por exemplo:

Kotlin

Log.d(tag, message)

Java

Log.d(tag, message);

A prioridade é um dos seguintes valores:

  • V: Verbose (prioridade mais baixa)
  • D: Depuração
  • I: Informação
  • W: Aviso
  • E: Erro
  • A: Afirmar

O formato da mensagem de log é:

date time PID-TID/package priority/tag: message

Por exemplo, a seguinte mensagem de log tem uma prioridade de V e uma tag de AuthZen:

12-10 13:02:50.071 1901-4229/com.google.android.gms V/AuthZen: Handling delegate intent.

PID significa identificador de processo e TID é identificador de thread; eles podem ser os mesmos se houver apenas um thread.

Definir o nível de log

Você pode controlar quantas mensagens aparecem no logcat, definindo o nível de log. Você pode exibir todas as mensagens, ou apenas as mensagens indicando as condições mais severas.

Lembre-se que o logcat continua a coletar todas as mensagens independentemente da configuração do nível de log. A configuração apenas determina o logcat que é exibido.

No menu Nível de Log, selecione um dos seguintes valores:

  • Verbose: Mostrar todas as mensagens de log (o padrão).
  • Debug: Mostrar mensagens de log de depuração que são úteis apenas durante o desenvolvimento, assim como os níveis de mensagens mais baixos nesta lista.
  • Info: Mostrar mensagens de log esperadas para uso regular, bem como os níveis de mensagens mais baixos nesta lista.
  • Aviso: Mostrar possíveis problemas que ainda não são erros, bem como os níveis de mensagens mais baixos nesta lista.
  • Erro: Mostrar problemas que tenham causado erros, bem como o nível de mensagem mais baixo nesta lista.
  • Assert: Mostrar problemas que o desenvolvedor espera que nunca deveriam acontecer.

Procurar mensagens logcat

Procurar as mensagens atualmente exibidas em logcat:

  1. Selecionar Regex se você quiser usar um padrão de pesquisa de expressões regulares.
  2. Digite uma sequência de caracteres no campo de pesquisa .

    A exibição da saída do logcat muda de acordo.

  3. Pressione Enter para armazenar a cadeia de caracteres de pesquisa no menu durante esta sessão.
  4. Para repetir uma pesquisa, escolha-a no menu de pesquisa. Selecione ou desmarque Regex conforme necessário (a configuração não é lembrada).

Filter logcat messages

Uma maneira de reduzir a saída do log a um nível controlável é restringi-la usando um filtro.

Nota: O filtro aplica-se ao seu histórico logcat completo, não apenas às mensagens actualmente apresentadas no logcat. Certifique-se de que as outras opções de exibição estão definidas apropriadamente para que você possa ver a saída de filtro que deseja examinar.

Para definir e aplicar um filtro:

  1. No menu filtro, selecione uma opção de filtro:
    • Mostrar apenas a aplicação seleccionada: Mostrar apenas as mensagens produzidas pelo código da aplicação (o padrão). O Logcat filtra as mensagens de log utilizando o PID da aplicação activa.
    • Sem Filtros: Não aplicar filtros. O Logcat mostra todas as mensagens de registo do dispositivo, independentemente do processo que seleccionou.
    • Editar Configuração de Filtros: Crie ou modifique um filtro personalizado. Por exemplo, você poderia criar um filtro para visualizar as mensagens de log de duas aplicações ao mesmo tempo.

    Depois de definir os filtros, você também pode selecioná-los no menu. Para removê-los do menu, elimine-os.

  2. Se você selecionou Editar configuração de filtro, crie ou modifique um filtro:
    1. Especificar os parâmetros do filtro na caixa de diálogo Criar novo filtro Logcat:
      • Nome do filtro: Digite o nome de um filtro que você deseja definir, ou selecione-o no painel esquerdo para modificar um filtro existente. O nome pode conter apenas caracteres minúsculos, sublinhados e dígitos.
      • Log Tag: Opcionalmente, especifique uma tag. Para mais informações, consulte o Logcat Message Format.
      • Mensagem de log: Opcionalmente, especifique o texto da mensagem de log. Para mais informações, consulte o Logcat Message Format (Formato da mensagem de logcat).
      • Nome do pacote: Opcionalmente, especifique o nome de um pacote. Para mais informações, veja logcat Message Format (Formato da mensagem de logcat).
      • PID: Opcionalmente, especifique um ID de processo. Para mais informações, veja logcat Message Format.
      • Nível de log: Opcionalmente, selecione um nível de log. Para obter mais informações, consulte Definir o nível de log.
      • Regex: Selecione esta opção para usar a sintaxe de expressão regular para aquele parâmetro.
    2. Clique em + para adicionar a definição do filtro ao painel esquerdo.

      Para remover um filtro, selecione-o no painel esquerdo e clique em -.

    3. Quando terminar, clique em OK.

Se você acha que não vê as mensagens de log que deseja, tente selecionar Sem filtros e procurar por mensagens de log particulares.

Ler mensagens de coleta de lixo

Por vezes, quando ocorre um evento de coleta de lixo, elas são impressas para logcat.

Para mais detalhes sobre a memória do seu aplicativo, use oMemory Profiler.

Mensagens de log do Dalvik

No Dalvik (mas não no ART), cada GC imprime as seguintes informações para logcat:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, External_memory_stats, Pause_time

Exemplo:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, external 4703K/5261K, paused 2ms+2ms

Razão GC O que acionou o GC e que tipo de coleta ele é. Razões que podem aparecerincluindo:GC_CONCURRENTUm GC concorrente que liberta a memória à medida que a sua pilha começa a encher.GC_FOR_MALLOCUm GC foi causado porque seu aplicativo tentou alocar memória quando seu heap já estava cheio, então o sistema teve que parar seu aplicativo e recuperar memória.GC_HPROF_DUMP_HEAPUm GC que ocorre quando você solicita a criação de um arquivo HPROF para analisar o seu heap.GC_EXPLICITUm GC explícito, como quando você chamagc()(que você deve evitar chamar e ao invés disso confiar no GC para executar quando necessário).GC_EXTERNAL_ALLOCIsso acontece apenas no nível 10 e inferior da API (versões mais recentes alocam tudo no Dalvikheap). Um GC para memória alocada externamente (como os dados de pixel armazenados na memória inativa ou buffers de bytes NIO). Quantidade libertada A quantidade de memória recuperada a partir deste GC. Heap stats Percentagem livre da pilha e (número de objectos vivos)/(tamanho total da pilha). Estatísticas de memória externa Memória alocada externamente no nível 10 e inferior da API (quantidade de memória alocada) / (limite em que a coleta ocorrerá). Tempo de pausa As pilhas maiores terão tempos de pausa maiores. Os tempos de pausa concorrentes mostram duas pausas: uma no início da coleta e outra perto do fim.

Apesar que estas mensagens de log se acumulem, procure por aumentos nas estatísticas das pilhas (o3571K/9991K valor no exemplo acima). Se este valor continuar a aumentar, você pode ter um vazamento de memória.

Mensagens de log daART

Dálvik não é como Dalvik, ART não registra mensagens para GCs que não foram explicitamente solicitadas. Os GCs só são impressos quando são considerados lentos. Mais precisamente, se a pausa dos GC exceder 5ms ou a duração dos GC exceder 100ms. Se o aplicativo não estiver em um estado perceptível de pausa (como quando o aplicativo está em segundo plano, onde o usuário não pode antecipar uma GCpause), então nenhum dos seus GCs é considerado lento. GCs explícitos são sempre registrados.

ART inclui as seguintes informações em suas mensagens de registro de coleta de lixo:

I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace Objects, Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

Exemplo:

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace objects, 21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms

Razão GC O que acionou o GC e que tipo de coleta ele é. Razões que podem aparecerincluindo:ConcurrentUm GC concorrente que não suspende os fios da aplicação. Este GC roda em uma thread de fundo e não impede alocações.AllocO GC foi iniciado porque seu aplicativo tentou alocar memória quando seu heapwasso já estava cheio. Neste caso, a coleta de lixo ocorreu no thread de alocação.ExplicitA coleta de lixo foi explicitamente solicitada por uma aplicação, por exemplo, bycallinggc()ougc(). Como Dalvik, no ART a melhor prática é confiar no GC e evitar solicitar GCs explícitos, se possível. GCs explícitos são desencorajados porque eles bloqueiam a thread de alocação e desperdiçam ciclos de CPU desnecessariamente. GCs explícitos também podem causar jank (gagueira, julgamento ou interrupção na aplicação) se causarem a preempção de outros threads.NativeAllocA coleta foi causada pela pressão da memória nativa de alocações nativas como Bitmaps ou objetos de alocação de RenderScript.CollectorTransitionA coleção foi causada por uma transição heap; isto é causado pela mudança da estratégia GC em tempo de execução (como quando o aplicativo muda entre estados pauseperceptíveis). As transições do coletor consistem em copiar todos os objetos de um espaço de backup de lista livre para um espaço de bump poninter (ou vice-versa).

Isso ocorre apenas em dispositivos com pouca memória RAM antes do Android 8.0 quando um aplicativo muda de estado de processo de um estado de pauseperceptível (como quando o aplicativo está em primeiro plano, onde o usuário pode perceber uma pausa GC) para um estado não perceptível de pausa (ou vice versa).

HomogeneousSpaceCompactCompactação de espaço homogêneo é espaço de lista livre para compactação de espaço de lista livre que normalmente ocorre quando um aplicativo é movido para um estado de processo imperceptível de pausa. As principais razões para fazer isto são a redução do uso da RAM e a desfragmentação da pilha.DisableMovingGcEsta não é uma razão real de GC, mas uma nota que a coleta foi bloqueada devido ao uso deGetPrimitiveArrayCritical. enquanto a compactação simultânea de heap está ocorrendo. Em geral, o uso daGetPrimitiveArrayCritical é fortemente desencorajado devido às suas restrições na movimentação de coletores.HeapTrimEsta não é uma razão GC, mas uma nota de que a coleta foi bloqueada até que um acabamento da pilha tenha terminado. GC Name ART tem vários GCs diferentes que podem ser executados.Concurrent mark sweep (CMS)Um coletor de pilhas inteiro que liberta todos os espaços, exceto o espaço da imagem.Concurrent partial mark sweepUm coletor de pilhas na sua maioria inteiro que coleta todos os espaços que não sejam a imagem e os espaços zigotos.Concurrent sticky mark sweepUm coletor geracional que só pode liberar objetos alocados desde a última GC. Este colecionador de lixo é executado com mais freqüência do que uma varredura total ou parcial da marca, pois é mais rápido e tem pausas menores.Marksweep + semispaceUm GC não concorrente, copiando GC usado para transições de pilha, bem como a compactação homogênea do espaço (para desfragmentar a pilha). Objetos liberados O número de objetos que foram recuperados deste GC do espaço de não grandesobjetos. Tamanho liberado O número de bytes que foram recuperados deste GC do espaço de objetos não grandes. Grandes objectos libertados O número de objectos no grande espaço de objectos que foram recuperados desta colecção de lixo. Tamanho do objeto grande liberado O número de bytes no espaço do objeto grande que foram recuperados desta coleção de lixo. Estatísticas da pilha Porcentagem livre e (número de objetos vivos)/(tamanho total da pilha). Tempos de pausa Em geral os tempos de pausa são proporcionais ao número de referências de objetos que foram modificados enquanto o GC estava em execução. Atualmente, os GC do ART CMS têm apenas uma pausa, perto do final do GC. Os GC em movimento têm uma longa pausa que dura a maior parte da duração do GC.

Se você estiver vendo uma grande quantidade de GCs em logcat, procure por aumentos nas estatísticas da pilha (o25MB/38MB valor no exemplo acima). Se este valor continuar a aumentar e não parecer diminuir, você pode ter um vazamento de memória. Alternativamente, se você estiver vendo GC, que é pela razão “Alloc”, então você já está operando perto da sua capacidade de pilha e pode esperar exceçõesOOM em um futuro próximo.

Deixe uma resposta

O seu endereço de email não será publicado.