Translation(s): 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 se segue é um comando que deve ser executado como root (ou sudo). Um "$" no início significa que o que segue é um comando que deve ser executado como seu usuário 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

If a GTK program has received an X error; i.e. you see a message of the form:

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

then you can try running the program with --sync, and break on the gdk_x_error function in order to obtain a backtrace, thus:

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

Despejo do núcleo

For a crashed program, a core dump file may be used to evaluate post-mortem snapshot of the program's state at the time of the crash. You can check resource limitation including the maximum size of core files created by typing "ulimit" on the shell prompt. You may set the core file size to unlimited using "ulimit -c unlimited" and/or with some other configuration files (/etc/security/limits.conf, /usr/lib/sysctl.d/50-coredump.conf, and systemd service files).

The location of core dump file is specified by /proc/sys/kernel/core_pattern. If the systemd-coredump package is installed under systemd, it may look like.

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

Then the lz4-compressed core dump file is generated in /var/lib/systemd/coredump upon crash. You can get information on this compressed core file with:

 $ coredumpctl info -1

You can use this compressed core file with gdb by:

 $ coredumpctl gdb -1

See more:

--AriPollak and ?LoicMinier

CategoryDebugging