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
oufin
em GDB, é ostep-out
emIDEA
ouEclipse
.
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.