¿Cómo entrar, pasar y salir con GDB?


42

Escribí helpmientras estaba en el GDB pero no encontré nada sobre entrar, salir y salir. Puse un punto de interrupción en un programa de Asamblea en _start( break _start). Luego escribí nexty terminó la depuración. Supongo que fue porque terminó _starty no intervino como quería.

¿Alguien que pueda ayudar?


Lea los documentos completos de GDB. Según recuerdo, fueron muy útiles al respecto, cuando lo aprendí por primera vez. Desafortunadamente, no he necesitado depurar ningún programa a ese nivel durante varias décadas, por lo que los comandos reales parecen haberse intercambiado en mi cerebro. Entonces, realmente no puedo escribir una respuesta. Pero, si lo averigua en los manuales, puede responder a su propia pregunta para obtener una bonificación.
MAPA

@ MAP Lo intentaré de nuevo. Intenté usar un mejor depurador (KDbg) pero no logro usarlo en Ubuntu .
Pichi Wuana

Respuestas:


38

help running proporciona algunas pistas:

Hay stepe nextinstrucciones (y también nextiy 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.

Así podemos ver que los steppasos a subrutinas, pero nexta un paso más de subrutinas.

El stepy stepi(y el nexty nexti) se distinguen por incrementos de "línea" o "instrucción".

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

Relacionado es 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.

Hay mucha más información útil en https://sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html


¿Qué significa hasta que alcanza una línea de origen diferente ?
Pichi Wuana

1
for(i=0;i<10;i++) { printf("%d\n",i); }es una línea de origen pero múltiples instrucciones.
Stephen Harris

3
¿Hay alguna forma de salir? No pude encontrarlo en la ayuda para correr.
nukeguy

1
¿Qué quieres decir con "paso a paso"? El finishcomando completará el marco de la pila actual, que normalmente completará la subrutina actual y volverá a la persona que llama.
Stephen Harris el

@PichiWuana gdb pasará por tantas instrucciones de ensamblaje como sea necesario hasta que se alcance la primera instrucción que representa la siguiente línea de código fuente
U007D

0

Vine aquí porque tenía la misma pregunta. Eventualmente, pensé que para mi propósito, en cualquier momento en que pudiera usar algo como "salir" de un bucle, simplemente puedo establecer otro punto de interrupción después del bucle y luego dejar que el programa continuetermine el bucle y luego se ejecute en el punto de interrupción. Lo siento si eso es obvio para la mayoría de las personas, pero probablemente sea útil para alguien que busque una respuesta a esta pregunta.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.