Traduções: English - Português (Brasil) - Русский


Como obter um backtrace significativo

Esta página tentará explicar como obter um backtrace de depuração significativo de uma falha reproduzível no programa. Neste exemplo, instalaremos o pacote com símbolos de depuração para "hello" ou, se não estiver disponível, reconstrua e instale o pacote "hello" para manter as informações de depuração.

Para referência, um "#" no início de uma linha significa que o que vem a seguir é um comando que deve ser executado como root (ou sudo). Um "$" no início significa que o que vem a seguir é um comando que deve ser executado como seu(sua) usuário(a) normal. Um "(gdb)" no início significa que você deve digitar o restante da linha de comando no prompt do gdb (GNU Debugger).

# apt install gdb

Instalando os símbolos de depuração

Verifique se você tem o pacote AutomaticDebugPackages listado em seu SourcesList:

deb http://deb.debian.org/debian-debug/ $RELEASE-debug main
# for security updates
deb http://deb.debian.org/debian-debug/ $RELEASE-proposed-updates-debug main

Então, dependendo da sua versão, pode se parecer com isso:

deb http://deb.debian.org/debian-debug/ buster-debug main
# for security updates
deb http://deb.debian.org/debian-debug/ buster-proposed-updates-debug main

Outras possibilidades são:

deb http://deb.debian.org/debian-debug/ testing-debug main
deb http://deb.debian.org/debian-debug/ unstable-debug main
deb http://deb.debian.org/debian-debug/ experimental-debug main

Se você estiver usando o Debian buster ou posterior, instale debian-goodies e execute o script find-dbgsym-packages para descobrir quais pacotes do dbgsym instalar:

$ find-dbgsym-packages /usr/bin/hello
hello-dbgsym

Caso contrário, para ver se o pacote que você está tentando depurar inclui um pacote -dbgsym ou -dbg (por exemplo, para o pacote fonte hello, um pacote ello-dbgsym ou hello-dbg existe), procure-o no seu gerenciador de pacotes. Na linha de comando, você pode usar o seguinte comando:

$ apt-cache search hello dbg
p   hello-dbgsym            - Debug symbols for hello

Se esse também não tiver seu pacote de depuração, você pode tentar reconstruir o pacote, conforme explicado na próxima seção.

Se um pacote apropriado for encontrado, você poderá instalar o pacote de depuração apropriado e pular o processo de reconstrução nas instruções a seguir e seguir diretamente para a execução do gdb.

# apt install hello-dbgsym

Reconstruindo o pacote que você está depurando

Você pode pular esta seção se conseguir instalar os pacotes de símbolos de depuração necessários na seção anterior.

# apt install build-essential fakeroot gdb
# apt build-dep hello

$ DEB_BUILD_OPTIONS="nostrip noopt" apt -b source hello

# apt install ./hello_2.1.1-4_amd64.deb

$ file /usr/bin/hello # a saída deve conter "not stripped"

Executando o gdb

Modo em lote

Para incluir um backtrace em um relatório de bug, você pode executar este comando e tentar reproduzir sua falha:

$ gdb -batch -n -ex 'set pagination off' -ex run -ex bt -ex 'bt full' -ex 'thread apply all bt full' --args hello

Interativamente

Use este método se precisar executar interativamente o gdb.

Se o problema parece estar em uma biblioteca importante, como libc6, xlibs ou libgtk2.0-0, instale o pacote -dbg apropriado (por exemplo, libc6-dbg no caso da libc6) e execute o programa problemático novamente no gdb.

Frequentemente, você verá um backtrace em que uma ou mais das principais linhas estão em malloc() ou g_malloc(). Quando isso acontece, é provável que seu backtrace não seja muito útil. A maneira mais fácil de encontrar algumas informações úteis é definir a variável de ambiente MALLOC_CHECK_ como um valor de 2. Você pode fazer isso enquanto executa o gdb fazendo isso:

 $ MALLOC_CHECK_=2 gdb hello

Comandos avançados do gdb

Depurando erros no X

Se um programa GTK recebeu um erro X; ou seja, você vê uma mensagem na forma:

The program 'preview1' received an X Window System error.

Então você pode tentar executar o programa com --sync e interromper a função gdk_x_error para obter um retorno, assim:

 (gdb) break gdk_x_error
 (gdb) run --sync

Despejo do núcleo

Para um programa que travou, um arquivo de despejo do núcleo pode ser usado para avaliar a situação post-mortem do estado do programa no momento da travamento. Você pode verificar a limitação de recursos, incluindo o tamanho máximo dos arquivos do núcleo criados, digitando "ulimit" no prompt do shell. Você pode definir o tamanho do arquivo do núcleo como ilimitado usando "ulimit -c unlimited" e/ou com outros arquivos de configuração (/etc/security/limits.conf, /usr/lib/sysctl.d/50-coredump.conf e arquivos de serviço do systemd).

A local do arquivo de despejo principal é especificado por /proc/sys/kernel/core_pattern. Se o pacote systemd-coredump estiver instalado no systemd, pode parecer com:

|/lib/systemd/systemd-coredump ...

Em seguida, o arquivo de despejo do núcleo compactado pelo lz4 é gerado em /var/lib/systemd/coredump após um travamento. Você pode obter informações sobre esse arquivo de núcleo compactado com:

 $ coredumpctl info -1

Você pode usar esse arquivo de núcleo compactado com gdb da seguinte maneira:

 $ coredumpctl gdb -1

Veja mais:

--AriPollak e ?LoicMinier


CategoryDebugging