Como entrar, sair e sair com o GDB?

42

Digitei helpenquanto estava no GDB, mas não encontrei nada sobre entrar, sair e sair. Coloquei um ponto de interrupção em um programa de montagem em _start( break _start). Depois digitei nexte finalizei a depuração. Eu acho que foi porque terminou _starte não entrou como eu queria.

Alguém que possa ajudar?

Pichi Wuana
fonte
Leia os documentos completos do GDB. Pelo que me lembro, eles foram bastante úteis quando eu o aprendi. Infelizmente, não preciso depurar nenhum programa nesse nível há várias décadas, portanto os comandos reais parecem ter sido trocados no meu cérebro. Então, eu realmente não posso escrever uma resposta. Mas, se você descobrir nos manuais, poderá responder à sua própria pergunta para obter um bônus.
MAP
@ MAP Vou tentar novamente. Tentei usar um melhor depurador (KDbg), mas não consigo usá-lo no Ubuntu .
Pichi Wuana

Respostas:

38

help running fornece algumas dicas:

Existem stepe nextinstuções (e também nextie stepi).

(gdb) help next
Step program, proceeding through subroutine calls.
Usage: next [N]
Unlike "step", if the current source line calls a subroutine,
this command does not enter the subroutine, but instead steps over
the call, in effect treating it as a single source line.

Portanto, podemos ver que essas stepetapas entram nas sub - rotinas, mas nextpassarão pelas sub - rotinas.

O stepe stepi(e o nexte nexti) são diferenciados por incrementos de "linha" ou "instrução".

step -- Step program until it reaches a different source line
stepi -- Step one instruction exactly

Relacionado é finish:

(gdb) help finish
Execute until selected stack frame returns.
Usage: finish
Upon return, the value returned is printed and put in the value history.

Informações muito mais úteis estão em https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html

Stephen Harris
fonte
O que significa até atingir uma linha de origem diferente ?
Pichi Wuana
1
for(i=0;i<10;i++) { printf("%d\n",i); }é uma linha de origem, mas várias instruções.
Stephen Harris
3
Existe uma maneira de sair? Não consegui encontrar ajuda na execução.
Nkeguy
1
O que você quer dizer com "sair"? O finishcomando concluirá o quadro de pilha atual, que normalmente concluirá a sub-rotina atual e retornará ao chamador.
Stephen Harris
@PichiWuana gdb vai percorrer tantas instruções de montagem como necessário até que a primeira instrução que representa a próxima linha de código-fonte é atingido
U007D
0

Eu vim aqui porque tinha a mesma pergunta. Acabei descobrindo que, para meu propósito, a qualquer momento, poderia usar algo como "saída" de um loop, apenas posso definir outro ponto de interrupção após o loop e deixar o programa continueterminar o loop e executar o ponto de interrupção posteriormente. Desculpe se isso é óbvio para a maioria das pessoas, mas provavelmente é útil para quem procura uma resposta para esta pergunta.

fjahr
fonte