Como depurar uma biblioteca Qt5 instalada com o GDB?

3

Antecedentes: Estou programando com o Qt5 e quero depurar as principais bibliotecas do Qt5 no Debian usando o GDB.

Eu instalei todos os pacotes -dev e -dbg necessários. Quando tento depurar, o GDB reclama que o código-fonte não foi encontrado.

Como instalar o código-fonte e usá-lo no GDB?

    
por kevinarpe 09.05.2015 / 06:10

1 resposta

5

Estou respondendo a minha própria pergunta. Isso foi mais difícil do que eu esperava, e quero reunir todas as informações em um local conveniente.

Instalar pacotes binários, de desenvolvimento e de depuração

Isso pode ser feito usando apt (ou aptitude ).

Exemplo para o Qt5:

  • Bibliotecas compiladas: qt5-default
  • Pacote de desenvolvimento (cabeçalhos): qtbase5-dev
  • Depuração de símbolos: qtbase5-dbg

Localizar o nome do pacote de origem

Você pode encontrá-lo usando aptitude ou a ferramenta de pesquisa de pacotes Debian: link

Exemplo: a pesquisa por qtbase5-dbg localizará: link

A parte superior de cada página de pacote binário tem um link para o pacote de origem.

Exemplo: qtbase-opensource-src

Instalar pacote fonte

Se necessário, configure primeiro os repositórios do pacote apt source lendo esta resposta: link

  1. Largar raiz: su -
  2. cd /usr/src
  3. %código%
    • Exemplo: apt-get source ${source_package_name}
  4. O pacote de origem é baixado, descompactado / descompactado e inserido em um novo diretório.
    • Exemplo: apt-get source qtbase-opensource-src
  5. Remova a bola TAR transferida por download e outros arquivos (talvez /usr/src/qtbase-opensource-src-5.3.2+dfsg/ ). .dsc
  6. Crie um link simbólico: rm *.tar.* *.dsc

Configurar o GDB

(Esta seção pode ser preenchida usando sua conta não-root / regular.)

O GDB precisa de configuração para saber onde o código-fonte pode ser encontrado.

Cada pacote fonte é um pouco diferente, então vou usar o Qt5 como exemplo.

  1. ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src
  2. Encontre uma lista de subdiretórios de origem:
    cd /usr/src/qtbase-opensource-src/src
    • Exemplo: find $(pwd) -mindepth 1 -maxdepth 1 -type d
  3. Reformate a saída /usr/src/qtbase-opensource-src/src/corelib ... para criar comandos do GDB:
    find
    • Exemplo: find $(pwd) -mindepth 1 -maxdepth 1 -type d | sort | xargs -l -i printf -- 'directory %s\n' "{}"
  4. Insira comandos do GDB no seu directory /usr/src/qtbase-opensource-src/src/3rdparty ... por conveniência.

Amostra ~/.gdbinit :

set auto-load safe-path /
set history save
set history filename ~/.gdb_history

directory /usr/src/qtbase-opensource-src/src/3rdparty
directory /usr/src/qtbase-opensource-src/src/android
directory /usr/src/qtbase-opensource-src/src/angle
directory /usr/src/qtbase-opensource-src/src/concurrent
directory /usr/src/qtbase-opensource-src/src/corelib
directory /usr/src/qtbase-opensource-src/src/dbus
directory /usr/src/qtbase-opensource-src/src/gui
directory /usr/src/qtbase-opensource-src/src/network
directory /usr/src/qtbase-opensource-src/src/opengl
directory /usr/src/qtbase-opensource-src/src/openglextensions
directory /usr/src/qtbase-opensource-src/src/platformsupport
directory /usr/src/qtbase-opensource-src/src/plugins
directory /usr/src/qtbase-opensource-src/src/printsupport
directory /usr/src/qtbase-opensource-src/src/sql
directory /usr/src/qtbase-opensource-src/src/testlib
directory /usr/src/qtbase-opensource-src/src/tools
directory /usr/src/qtbase-opensource-src/src/widgets
directory /usr/src/qtbase-opensource-src/src/winmain
directory /usr/src/qtbase-opensource-src/src/xml
show directories

Executar o GDB

Esta seção pressupõe que você já tenha um programa compilado com símbolos de depuração vinculados à biblioteca de interesse, por exemplo, Qt5.

  1. ~/.gdbinit
  2. Inicie o programa e divida a gdb ${program_name} automaticamente: main()
  3. Defina um ponto de interrupção em uma função de biblioteca: start
    Comando b '${function_signature}' com suporte a aspas simples (muito impressionante!) conclusão da guia.
    • Exemplo: b(reakpoint)
      - > b 'QStyled<tab>
      - > b 'QStyledItemDelegate
      - > %código%
  4. Continue a atingir o novo ponto de interrupção: ::paint(<tab> ou b 'QStyledItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const'
  5. Quando o ponto de interrupção da biblioteca for atingido, o GDB encontrará e exibirá o código-fonte.
por 09.05.2015 / 06:10

Tags