Tenho um programa em assembly que desejo depurar. Se esse programa fosse montado com símbolos, eu poderia simplesmente definir um ponto de interrupção em _start
e, depois de dizer ao GDB para executá-lo, ele pararia imediatamente, pois _start
é onde o executável está definido para iniciar.
No entanto, suponha que este programa tenha seus símbolos removidos. Nesse caso, seria impossível definir um ponto de interrupção, _start
pois esse símbolo não existe mais. Embora eu pudesse vasculhar o cabeçalho do executável para encontrar o início definido do programa, estou tão acostumado a essa operação que esperaria que o GDB tivesse a opção de "executar em modo passo a passo". No entanto, não encontrei nenhuma informação online sobre como fazer isso.
stepi
enexti
(si
eni
) para uma única etapa por instrução de montagem em vez da linha de origem.Use
layout asm
para mostrar a desmontagem conforme você avança (modo TUI)e/ou comandos usuais como
disas
ex /i
Use
starti
para iniciar o processo pausado, antes de executar a primeira instrução do espaço do usuário.Normalmente, isso ocorrerá
_start
no vinculador dinâmico, não no próprio executável_start
(ponto de entrada ELF), a menos que seja um executável estático.Então o que você pode realmente querer fazer é
info file
( depoisstarti
que o processo existir e houver um endereço base escolhido pelo kernel para que os endereços impressos pelo GDB possam ser endereços absolutos reais. O GDB desabilita o ASLR por padrão para um processo iniciado dentro dele, então o Linux sempre escolhe0x555...
executáveis PIE.)Então defina um ponto de interrupção lá com
b *address
, usando o endereço numérico.Por exemplo, no x86-64 Arch GNU/Linux (com alguma verbosidade eliminada):
No modo TUI, você pode segurar Shift para que a seleção do mouse funcione normalmente, apesar de o GDB ter o terminal em um modo em que cliques com o botão esquerdo e clicar e arrastar não selecionam como normalmente fazem. (Estou usando o Konsole, o equivalente ao xterm do KDE.)
Imagino que a maior parte disso também funcionaria no Windows e no macOS.