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
- Largar raiz:
su -
-
cd /usr/src
-
%código%
- Exemplo:
apt-get source ${source_package_name}
- Exemplo:
- O pacote de origem é baixado, descompactado / descompactado e inserido em um novo diretório.
- Exemplo:
apt-get source qtbase-opensource-src
- Exemplo:
- Remova a bola TAR transferida por download e outros arquivos (talvez
/usr/src/qtbase-opensource-src-5.3.2+dfsg/
)..dsc
- 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.
-
ln -s qtbase-opensource-src-5.3.2+dfsg qtbase-opensource-src
- Encontre uma lista de subdiretórios de origem:
cd /usr/src/qtbase-opensource-src/src
- Exemplo:
find $(pwd) -mindepth 1 -maxdepth 1 -type d
- Exemplo:
- 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' "{}"
- Exemplo:
- 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.
-
~/.gdbinit
- Inicie o programa e divida a
gdb ${program_name}
automaticamente:main()
- Defina um ponto de interrupção em uma função de biblioteca:
start
Comandob '${function_signature}'
com suporte a aspas simples (muito impressionante!) conclusão da guia.- Exemplo:
b(reakpoint)
- >b 'QStyled<tab>
- >b 'QStyledItemDelegate
- > %código%
- Exemplo:
- Continue a atingir o novo ponto de interrupção:
::paint(<tab>
oub 'QStyledItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const'
- Quando o ponto de interrupção da biblioteca for atingido, o GDB encontrará e exibirá o código-fonte.