Digitei help enquanto estava no GDB, mas não encontrei nada sobre step-into, step -over e sair. Coloquei um ponto de interrupção em um programa de montagem em _start (break _start). Depois, digitei next e terminou a depuração. Acho que foi porque terminou _start e não “t entre como eu queria.

Alguém que pode ajudar?

Comentários

  • Leia a documentação GDB completa. Pelo que me lembro, eles foram muito úteis sobre isso, quando eu estava aprendendo. Infelizmente, não ' não precisei depurar nenhum programa naquele nível por várias décadas, então os comandos reais parecem ter sido trocados em meu cérebro. Portanto, não posso ' realmente escrever uma resposta. Mas, se você descobrir isso nos manuais, poderá responder à sua própria pergunta para ganhar um bônus.
  • @MAP I ' vou tentar novamente. Tentei usar um depurador melhor (KDbg), mas não ' não consegui usá-lo no Ubuntu .
  • gdb é um bom depurador. Você pode querer usar o Emacs como front-end.
  • gdb é um depurador terrível. Há uma infinidade de extensões para lidar com o quanto isso é uma merda. Sintaxe horrível, comandos não consistentes, paginação horrível desajeitada, formatação arcaica, não ' tem um hexdump. Portanto, não, ele ' não é um bom depurador. Se você acha que é, então você ' não usou um bom depurador.

Resposta

help running fornece algumas dicas:

Existem step e next instruções (e também nexti e 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. 

Assim, podemos ver que step passa para sub-rotinas, mas next vai sobre sub-rotinas.

O step e stepi (e o next e nexti) distinguem por incrementos de “linha” ou “instrução”.

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

Relacionado está 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. 

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

Comentários

  • O que faz entende por até atingir uma linha de origem diferente ?
  • for(i=0;i<10;i++) { printf("%d\n",i); } é uma linha de origem, mas várias instruções.
  • Existe uma maneira de sair? Não consegui ' não encontrá-lo no help running.
  • O que você quer dizer com " step-out "? O comando finish completará o quadro de pilha atual, que normalmente completará a sub-rotina atual e retornará ao chamador.
  • finish ou fin em GDB, é o step-out em IDEA ou Eclipse.

Resposta

Vim aqui porque tinha a mesma pergunta . Acabei descobrindo que, para meu propósito, a qualquer momento que eu pudesse usar algo como “saída” de um loop, posso apenas definir outro ponto de interrupção após o loop e deixar o programa continue terminar o loop e execute 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.

Resposta

Use o comando “terminar”; isso às vezes faz a mesma coisa que “sair”. Ele vai terminar o que a pilha está fazendo (uma função, geralmente) e vai para a próxima linha depois disso. Procure o comando para mais informações.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *