Red Hat Training

A Red Hat training course is available for RHEL 8

16.4. Mudanças na GDB quebras de compatibilidade

A versão do GDB fornecida no Red Hat Enterprise Linux 8 contém uma série de mudanças que quebram a compatibilidade, especialmente para casos em que a saída do GDB é lida diretamente do terminal. As seções seguintes fornecem mais detalhes sobre estas mudanças.

Não se recomenda a saída da GDB para análise. Preferir scripts usando o Python GDB API ou a Interface de Máquina GDB (MI).

O GDBserver agora começa inferiors com shell

Para permitir expansão e substituição de variáveis em argumentos de linha de comando inferior, o GDBserver agora inicia o inferior em uma concha, o mesmo que o GDB.

Para desativar o uso da casca:

  • Ao usar o comando target extended-remote GDB, desabilite o shell com o comando set startup-with-shell off.
  • Ao utilizar o comando target remote GDB, desabilite o shell com a opção --no-startup-with-shell do GDBserver.

Exemplo 16.1. Exemplo de expansão de conchas em inferiors remotos de GDB

Este exemplo mostra como a execução do comando /bin/echo /* através do GDBserver difere nas versões 7 e 8 do Red Hat Enterprise Linux:

  • Sobre a RHEL 7:

    $ gdbserver --multi :1234
    $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*'
    /*
  • Sobre a RHEL 8:

    $ gdbserver --multi :1234
    $ gdb -batch -ex 'target extended-remote :1234' -ex 'set remote exec-file /bin/echo' -ex 'file /bin/echo' -ex 'run /*'
    /bin /boot (...) /tmp /usr /var

gcj suporte removido

O suporte para depuração de programas Java compilados com o Compilador GNU para Java (gcj) foi removido.

Nova sintaxe para comandos de manutenção de dumping de símbolos

A sintaxe dos comandos de manutenção de dumping de símbolos agora inclui opções antes dos nomes dos arquivos. Como resultado, comandos que funcionavam com GDB no RHEL 7 não funcionam no RHEL 8.

Como exemplo, o seguinte comando não mais armazena símbolos em um arquivo, mas produz uma mensagem de erro:

(gdb) símbolos de impressão de manutenção /tmp/out main.c

A nova sintaxe para os comandos de manutenção do símbolo dumping é:

maint print symbols [-pc address] [--] [filename]
maint print symbols [-objfile objfile] [-source source] [--] [filename]
maint print psymbols [-objfile objfile] [-pc address] [--] [filename]
maint print psymbols [-objfile objfile] [-source source] [--] [filename]
maint print msymbols [-objfile objfile] [--] [filename]

Os números de rosca não são mais globais

Anteriormente, a GDB utilizava apenas a numeração global de linhas. A numeração foi estendida para ser exibida por inferior no formulário inferior_num.thread_num, como por exemplo 2.1. Como conseqüência, a numeração de segmentos na variável de conveniência $_thread e no atributo InferiorThread.num Python não são mais únicos entre os inferiores.

A GDB agora armazena um segundo ID de linha por linha, chamado de ID global de linha, que é o novo equivalente dos números de linha nos lançamentos anteriores. Para acessar o número global de thread, use a variável de conveniência $_gthread e o atributo InferiorThread.global_num Python.

Para compatibilidade com versões anteriores, as identificações de linha da Interface de Máquina (MI) sempre contêm as identificações globais.

Exemplo 16.2. Exemplo de mudanças no número de fios da GDB

No Red Hat Enterprise Linux 7:

# debuginfo-install coreutils
$ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread'
(...)
  Id   Target Id         Frame
* 2    process 203923 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109
  1    process 203914 "echo" main (argc=1, argv=0x7fffffffdb88) at src/echo.c:109
$1 = 2
(...)
$2 = 1

No Red Hat Enterprise Linux 8:

# dnf debuginfo-install coreutils
$ gdb -batch -ex 'file echo' -ex start -ex 'add-inferior' -ex 'inferior 2' -ex 'file echo' -ex start -ex 'info threads' -ex 'pring $_thread' -ex 'inferior 1' -ex 'pring $_thread'
(...)
  Id   Target Id         Frame
  1.1  process 4106488 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109
* 2.1  process 4106494 "echo" main (argc=1, argv=0x7fffffffce58) at ../src/echo.c:109
$1 = 1
(...)
$2 = 1

A memória para conteúdos de valor pode ser limitada

Anteriormente, a GDB não limitava a quantidade de memória alocada para o conteúdo de valores. Como conseqüência, a depuração de programas incorretos poderia fazer com que a GDB alocasse demasiada memória. A configuração max-value-size foi adicionada para permitir limitar a quantidade de memória alocada. O valor padrão deste limite é 64 KiB. Como resultado, o GDB no Red Hat Enterprise Linux 8 não exibirá valores muito grandes, mas informará que o valor é muito grande em seu lugar.

Como exemplo, a impressão de um valor definido como char s[128*1024]; produz resultados diferentes:

  • No Red Hat Enterprise Linux 7, $1 = 'A' <repeats 131072 times>
  • No Red Hat Enterprise Linux 8, value requires 131072 bytes, which is more than max-value-size

A versão Sun do formato de facadas não é mais suportada

O suporte para a versão Sun do formato de arquivo de debug stabs foi removido. O formato stabs produzido pela GCC em RHEL com a opção gcc -gstabs ainda é suportado pela GDB.

Mudanças no manuseio do sistema

O set sysroot path especifica a raiz do sistema ao procurar por arquivos necessários para a depuração. Os nomes de diretórios fornecidos a este comando podem agora ser prefixados com a string target: para fazer o GDB ler as bibliotecas compartilhadas do sistema alvo (tanto local quanto remoto). O prefixo anteriormente disponível remote: é agora tratado como target:. Além disso, o valor padrão da raiz do sistema mudou de uma string vazia para target: para compatibilidade retroativa.

A raiz do sistema especificado é prefixada ao nome do arquivo do executável principal, quando o GDB inicia processos remotamente, ou quando ele se liga a processos já em execução (tanto locais quanto remotos). Isto significa que para processos remotos, o valor padrão target: faz com que a GDB sempre tente carregar as informações de depuração a partir do sistema remoto. Para evitar isto, execute o comando set sysroot antes do comando target remote para que os arquivos de símbolos locais sejam encontrados antes dos remotos.

HISTSIZE não controla mais o tamanho do histórico de comando da GDB

Anteriormente, a GDB utilizava a variável de ambiente HISTSIZE para determinar quanto tempo o histórico de comando deveria ser mantido. A GDB foi alterada para usar a variável de ambiente GDBHISTSIZE em seu lugar. Esta variável é específica apenas para a GDB. Os valores possíveis e seus efeitos são:

  • um número positivo - use um histórico de comando deste tamanho,
  • -1 ou uma corda vazia - manter o histórico de todos os comandos,
  • valores não-numéricos - ignorados.

Limitação de conclusão adicionada

O número máximo de candidatos considerados durante a conclusão pode agora ser limitado usando o comando set max-completions. Para mostrar o limite atual, execute o comando show max-completions. O valor padrão é 200. Este limite evita que a GDB gere listas de conclusão excessivamente grandes e se torne insensível.

Como exemplo, a saída após a entrada p <tab><tab> é:

  • na RHEL 7 Display all 29863 possibilities? (y or n)
  • no RHEL 8 Display all 200 possibilities? (y or n)

Modo de compatibilidade HP-UX XDB removido

A opção -xdb para o modo de compatibilidade HP-UX XDB foi removida da GDB.

Manuseio de sinais para roscas

Anteriormente, a GDB podia fornecer um sinal para a linha atual em vez da linha para a qual o sinal era realmente enviado. Este erro foi corrigido e agora a GDB sempre passa o sinal para a linha correta ao retomar a execução.

Além disso, o comando signal agora sempre entrega corretamente o sinal solicitado para a linha atual. Se o programa for interrompido por um sinal e o usuário trocar de linha, a GDB pede confirmação.

Modos de ponto de parada sempre fora de linha e auto-moldados

A configuração breakpoint always-inserted foi alterada. O valor auto e o comportamento correspondente foi removido. O valor padrão agora é off. Além disso, o valor off agora faz com que a GDB não remova os pontos de parada do alvo até que todos os threads parem.

comandos remotebaud não são mais suportados

Os comandos set remotebaud e show remotebaud não são mais suportados. Use os comandos set serial baud e show serial baud em seu lugar.