Differences between revisions 2 and 3
Revision 2 as of 2020-07-25 12:48:06
Size: 8947
Editor: ?RafaelFontenelle
Comment: Translate headings
Revision 3 as of 2020-07-25 14:28:53
Size: 9327
Editor: ?RafaelFontenelle
Comment: Partial translation
Deletions are marked like this. Additions are marked like this.
Line 9: Line 9:
This page will attempt to explain how to get a meaningful debugging backtrace from a reproducible program crash. For this example, we will install the package with debugging symbols for "hello" or if this is not available rebuild & install the "hello" package so that we keep debugging information.

For reference, a "#" at the beginning of a line means that what follows is a command that has to be executed as root (or sudo). A "$" at the beginning means that what follows is a command that should be executed as your normal user. A "(gdb)" at the beginning means that you should be typing the rest of the command line at the gdb (GNU Debugger) prompt.
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).
Line 19: Line 18:
Make sure you have the AutomaticDebugPackages archive listed in your SourcesList: Verifique se vo tem o pacote AutomaticDebugPackages listado em seu [[pt_BR/SourcesList|SourcesList]]:
Line 27: Line 26:
So, depending on your [[DebianReleases|release]], it might look like this: Então, dependendo da sua [[pt_BR/DebianReleases|versão]], pode se parecer com isso:
Line 34: Line 33:
Other possibilities are: Outras possibilidades são:
Line 41: Line 40:
If you are using Debian buster or later, install DebianPackage:debian-goodies and run the find-dbgsym-packages script to find which dbgsym packages to install: Se vo estiver usando o Debian buster ou posterior, instale DebianPackage:debian-goodies e execute o script find-dbgsym-packages para descobrir quais pacotes do dbgsym instalar:
Line 48: Line 47:
Otherwise, to see if the package you’re trying to debug includes a -dbgsym or -dbg package (e.g. for the ''hello'' source package, a ''hello-dbgsym'' or ''hello-dbg'' package exists), search for it in your package manager. On the command line you can use the following command. 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.
Line 54: Line 53:
If that doesn't have your debug package either, you could try to rebuild the package as explained in the next section.

If an appropriate package was found you should just be able to install the appropriate debug package and skip the rebuilding process in the following instructions and go straight to running gdb.
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.
Line 64: Line 63:
''You may skip this section if you were able to install the necessary debug symbols package(s) from the previous section.''
 * Install the basic development packages and the build-dependencies for the package we want to rebuild. Note that you can skip the rebuilding part and go straight to running gdb, but it is unlikely that you will get a useful backtrace. (If the build-dep line fails, check you have deb-src lines in [[SourcesList|apt sources]])
''Você pode pular esta seção se conseguir instalar os pacotes de símbolos de depuração necessários na seção anterior.''
 * Instale os pacotes básicos de desenvolvimento e as dependências de compilação para o pacote que queremos reconstruir. Observe que você pode pular a parte de reconstrução e ir direto para o gdb, mas é improvável que você obtenha um backtrace útil. (Se a linha build-dep falhar, verifique se você possui linhas deb-src em [[pt_BR/SourcesList|apt sources]])
Line 72: Line 71:
 * Download & rebuild our package from source, keeping debugging symbols  * Faça o download e reconstrua nosso pacote da fonte, mantendo os símbolos de depuração
Line 78: Line 77:
 * Install our newly built package(s). There may be multiple .deb packages generated, so make sure to install only the ones you want. In this example, the .deb generated was called hello_2.1.1-4_amd64.deb.  * Instale nossos pacotes recém-construídos. Pode haver vários pacotes .deb gerados, portanto, instale apenas os que você deseja. Neste exemplo, o .deb gerado foi chamado hello_2.1.1-4_amd64.deb.
Line 84: Line 83:
 * You can ensure the binaries installed from your .deb have debugging symbols with the 'file' command, or with gdb itself (see below).

{{{
$ file /usr/bin/hello # output should contain "not stripped"
 * Você pode garantir que os binários instalados no seu .deb tenham símbolos de depuração com o comando "file" ou com o próprio gdb (veja abaixo).

{{{
$ file /usr/bin/hello # a saída deve conter "not stripped"
Line 94: Line 93:
For including a backtrace in a bug report, you can run this command and then try to reproduce your crash: Para incluir um backtrace em um relatório de bug, você pode executar este comando e tentar reproduzir sua falha:
Line 102: Line 101:
Use this method if you need to interactively run gdb.

 * Now run your program as follows, replacing "[--args]" with any arguments you want to run the program with:{{{
Use este método se precisar executar interativamente o gdb.

 * Agora, execute seu programa conforme a seguir, substituindo "[--args]" com quaisquer argumentos com os quais você deseje executar programa:{{{
Line 111: Line 110:
 * Then try to reproduce your crash. If you’re lucky, a crash will occur and you’ll be dropped back to the gdb prompt.
 * If you are not so lucky to get a crash but instead get a freeze, you can still get gdb prompt by pressing CTRL-C in the terminal running gdb.
 * At that point, you can run:{{{
 * Em seguida, tente reproduzir sua falha. Se você tiver sorte, ocorrerá uma falha e você voltará ao prompt do gdb.
 * Se você não tiver tanta sorte em o programa travar, mas sim congelar, ainda poderá receber o prompt do gdb pressionando CTRL-C no terminal executando o gdb.
 * Neste ponto, você pode executar:{{{
Line 116: Line 115:
 * You’ll then get a lot of output, which you can then copy & paste to a bug followup e-mail or other bug reporting tool.
 * When you’re done with gdb, you can just run:{{{
 * Você obterá muita saída, que poderá copiar e colar em um e-mail de acompanhamento de relatório de bug ou em outra ferramenta de relatório de bug.
 * Quando você tiver terminado com o gdb, você pode simplesmente executar:{{{
Line 121: Line 120:
If the problem seems to be in a major library such as libc6, xlibs, or libgtk2.0-0, you’ll want to install the appropriate -dbg package (e.g. libc6-dbg in the case of libc6) and then run the problematic program again under gdb.

Often, you will see a backtrace where one or more of the top lines is in malloc() or g_malloc(). When this happens, chances are your backtrace isn’t very useful. The easiest way to find some useful information is to set the environment variable MALLOC_CHECK_ to a value of 2. You can do this while running gdb by doing this:{{{
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:{{{

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.

  • Instale os pacotes básicos de desenvolvimento e as dependências de compilação para o pacote que queremos reconstruir. Observe que você pode pular a parte de reconstrução e ir direto para o gdb, mas é improvável que você obtenha um backtrace útil. (Se a linha build-dep falhar, verifique se você possui linhas deb-src em apt sources)

# apt install build-essential fakeroot gdb
# apt build-dep hello
  • Faça o download e reconstrua nosso pacote da fonte, mantendo os símbolos de depuração

$ DEB_BUILD_OPTIONS="nostrip noopt" apt -b source hello
  • Instale nossos pacotes recém-construídos. Pode haver vários pacotes .deb gerados, portanto, instale apenas os que você deseja. Neste exemplo, o .deb gerado foi chamado hello_2.1.1-4_amd64.deb.

# apt install ./hello_2.1.1-4_amd64.deb
  • Você pode garantir que os binários instalados no seu .deb tenham símbolos de depuração com o comando "file" ou com o próprio gdb (veja abaixo).

$ 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.

  • Agora, execute seu programa conforme a seguir, substituindo "[--args]" com quaisquer argumentos com os quais você deseje executar programa:

     $ gdb hello
     ... gdb loads ...
     (gdb) set pagination 0
     (gdb) run [--args]
     ... hello loads...
  • Em seguida, tente reproduzir sua falha. Se você tiver sorte, ocorrerá uma falha e você voltará ao prompt do gdb.
  • Se você não tiver tanta sorte em o programa travar, mas sim congelar, ainda poderá receber o prompt do gdb pressionando CTRL-C no terminal executando o gdb.
  • Neste ponto, você pode executar:

     (gdb) bt
  • Você obterá muita saída, que poderá copiar e colar em um e-mail de acompanhamento de relatório de bug ou em outra ferramenta de relatório de bug.
  • Quando você tiver terminado com o gdb, você pode simplesmente executar:

     (gdb) quit

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

  • If the program you’re backtracing is multi-threaded, you might want to get a backtrace for all threads:

     (gdb) thread apply all bt
  • Another thing which is quite helpful to report is what variables were set locally at each point in the stack:

     (gdb) bt full
  • You might want to report the output of the combination of the preceding options:

     (gdb) thread apply all bt full
  • And if this is too much irrelevant output, you might want to keep only a few calls, such as the top 10:

     (gdb) thread apply all bt full 10
  • If you have a large backtrace, you can log gdb output to a file (the default is gdb.txt):

     (gdb) set logging on
  • To check you have debugging symbols in your binary:

     $ gdb
      (gdb) symbol-file /usr/bin/hello
    
     # you should see something like this:
      Reading symbols from /usr/bin/hello ... done
      Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
      (gdb)
    
     # NB you should _not_ see
      Reading symbols from /usr/bin/hello...(no debugging symbols found)...done

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