Jump to content
From ArchWiki
Status de tradução: Esse artigo é uma tradução de Debug - Getting Traces. Data da última tradução: 2020-09-14. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

Artigos relacionados

- Solução de problemas gerais
- Diretrizes de relatórios de erro
- Step-by-step debugging guide

Esse artigo visa ajudar na criação de um pacote de depuração do Arch e usá-lo para fornecer informações de rastro e depuração para relatar bugs de software para desenvolvedores.

Normalmente, os arquivos executáveis têm símbolos removidos (strip) de contexto legível por humanos para torná-los menores. Além disso, as informações de depuração aprimoradas geralmente não são adicionadas ao executável em primeiro lugar, o que reduz drasticamente a qualidade do rastreamento. Portanto, antes de obter rastreamentos com informações de depuração, é necessário recompilar o pacote sem remover e com informações de depuração.

## Nomes de pacotes

A primeira coisa a fazer é obter os nomes dos pacotes que precisam ser recompilados.

Ao procurar por mensagens de depuração, como, por exemplo, usando gdb em um despejo de núcleo:

    [...]
    Backtrace was generated from '/usr/bin/epiphany'

    (no debugging symbols found)
    Using host libthread_db library "/lib/libthread_db.so.1".
    (no debugging symbols found)
    [Thread debugging using libthread_db enabled]
    [New Thread -1241265952 (LWP 12630)]
    (no debugging symbols found)
    0xb7f25410 in __kernel_vsyscall ()
    #0  0xb7f25410 in __kernel_vsyscall ()
    #1  0xb741b45b in ?? () from /lib/libpthread.so.0
    [...]

`??` mostra onde a informação de depuração está faltando, assim como o nome da biblioteca ou executável que chamou a função. Similarmente, quando `(no debugging symbols found)` aparece, você deve procurar pelos nomes de arquivos mencionados. Por exemplo, com pacman:

    $ pacman -Qo /lib/libthread_db.so.1
    /lib/libthread_db.so.1 pertence a glibc 2.5-8

O pacote é chamado glibc na versão 2.5-8. Repita essa etapa para todo pacote que precisa de depuração.

## PKGBUILD

Para compilar um pacote a partir do fonte, o arquivo PKGBUILD file é necessário. Veja ABS (Português) para pacotes nos repositórios oficiais, e AUR (Português)#Obtendo arquivos de compilação para pacotes no AUR.

## Configurações de compilação

Neste estágio, você pode modificar o arquivo de configuração global do `makepkg` se você for usá-lo apenas para propósito de depuração. Nos demais casos, você deve modificar o arquivo PKGBUILD do pacote apenas para cada pacote que você gostaria de recompilar.

### Geral

Desde o pacman 4.1, `/etc/makepkg.conf` possui flags de depuração de compilação em `DEBUG_CFLAGS` e `DEBUG_CXXFLAGS`. Para usá-las, habilite a opção do makepkg `debug` e desabilite `strip`.

    OPTIONS+=(debug !strip)

Estas configurações vão forçar a compilação com símbolos de depuração e vai desabilitar a remoção deles dos executáveis. Para aplicar essa configuração a um único pacote, modifique o PKGBUILD:

    options=(debug !strip)

Alternativamente, você pode colocar as informações de depuração em um pacote separado habilitando `debug` e `strip`, símbolos de depuração serão então removidos do pacote principal e colocados, junto com seus arquivos fontes para ajudar a analisá-los no depurador, em um pacote separado `foo-debug`.

Nota: Não é suficiente só instalar o pacote de depuração de recentemente compilado, porque o depurador vai conferir se o arquivo contendo os símbolos de depuração é o da mesma compilação que a biblioteca e executável associados. Você deve instalar os pacotes recompilados. No Arch, os arquivos de símbolo de depuração são instalados sob `/usr/lib/debug` e os arquivos fontes são instalados sob `/usr/src/debug`. Veja a documentação do GDB para mais informações sobre os pacotes de depuração.

Note que certos pacotes como glibc são removidos. Verifique o PKGBUILD para seções como:

    strip $STRIP_BINARIES usr/bin/{gencat,getconf,getent,iconv,iconvconfig} \
                          usr/bin/{ldconfig,locale,localedef,nscd,makedb} \
                          usr/bin/{pcprofiledump,pldd,rpcgen,sln,sprof} \
                          usr/lib/getconf/*

    strip $STRIP_STATIC usr/lib/*.a

    strip $STRIP_SHARED usr/lib/{libanl,libBrokenLocale,libcidn,libcrypt}-*.so \
                        usr/lib/libnss_{compat,db,dns,files,hesiod,nis,nisplus}-*.so \
                        usr/lib/{libdl,libm,libnsl,libresolv,librt,libutil}-*.so \
                        usr/lib/{libmemusage,libpcprofile,libSegFault}.so \
                        usr/lib/{audit,gconv}/*.so

E, então, remova onde apropriado.

### dhcpcd

Lembre-se de passar o sinalizador `--debug` para o script `configure` ao compilar dhcpcd.

## Compilando e instalando o pacote

Compile o pacote a partir do fonte usando `makepkg` no diretório do PKGBUILD. Isso pode levar algum tempo:

    $ makepkg

Então, instale o pacote compilado:

    # pacman -U glibc-2.26-1-x86_64.pkg.tar.gz

## Obtendo o rastro

O backtrace real (ou rastro de pilha) pode agora ser obtido por meio de, p.ex. gdb, o GNU Debugger. Execute-o através de:

    # gdb /caminho/para/arquivo

ou:

    # gdb
    (gdb) exec /caminho/para/arquivo

O caminho é opcional, se já definido na variável `$PATH`.

Então, dentro do `gdb`, digite `run` seguido por quaisquer argumentos que você deseje que o programa inicie com, p.ex.:

    (gdb) run --no-daemon --verbose

para iniciar a execução do arquivo. Faça o que for necessário para evocar o erro. Para registrar log, digite as linhas:

    (gdb) set logging file rastro.log
    (gdb) set logging on

e então:

    (gdb) thread apply all bt full

para emitir o rastro para `rastro.log` no diretório no qual `gdb` foi iniciado. Para sair, digite:

    (gdb) set logging off
    (gdb) quit

Dica: Para depurar um aplicativo escrito em python:

    # gdb /usr/bin/python
    (gdb) run <aplicativo em python>

Você também pode depurar um aplicativo em execução, p.ex.:

     # gdb --pid=$(pidof firefox)
     (gdb) continue

Para depurar um aplicativo que já travou, você vai querer usar o gdb despejo de núcleo.

## Conclusão

Use o rastro de pilha completo para informar os desenvolvedores de um erro que você descobriu. Isso será muito apreciado por eles e ajudará a melhorar o seu programa favorito

## Veja também

- Debian Wiki - Como obter um backtrace
- Gentoo Wiki - Backtraces with Gentoo
- Fedora - StackTraces
- GNOME - Getting Stack Traces
- mini-introdução ao gdb

Category:

- Package development (Português)