¿Cuál es la diferencia entre nexti y stepi en gdb?

3 minutos de lectura

Avatar de usuario de Kobayashi
Kobayashi

Al depurar un ejecutable usando gdbhay dos comandos que podemos usar para recorrer la ejecución:

  • stepi y
  • nexti

¿Cuál es la diferencia entre estos dos y por qué alguien elegiría uno sobre el otro?

usando ayuda en gdb dice:

stepi: Paso una instrucción exactamente.

nexti: paso una instrucción, pero continúa a través de llamadas de subrutina.

dado que estamos tratando con instrucciones y código de máquina aquí (la parte más pequeña de un programa en ejecución), no puedo entender cuáles son las llamadas a subrutinas.

  • Si está en una llamada de función stepi pasará a la primera instrucción de la función y se detendrá. Si utiliza nexti la función se ejecutará y se detendrá en la instrucción después de la llamada. La documentación puede ser útil: sourceware.org/gdb/onlinedocs/gdb/Continuing-and-Stepping.html. Las llamadas a subrutinas son call instrucciones.

    -Michael Petch

    26 de agosto de 2018 a las 8:40


  • @MichaelPetch En realidad lo es, gracias

    – Kobayashi

    26 de agosto de 2018 a las 8:43


  • los nexti se detendrá en la siguiente instrucción después de call solo si el call en realidad regresa (en caso de algún error, o modificando intencionalmente/no usando la dirección de retorno, el call puede que nunca regrese a la siguiente instrucción).

    – Ped7g

    26 de agosto de 2018 a las 10:04

Avatar de usuario de Uddhav P. Gautam
Uddhav P. Gautam

stepi es más detallado que nexti. si llamas sum() de main() función entonces haciendo stepi te llega dentro de la función sum(), pero nexti no.

A continuación se muestra la captura de pantalla cuando llama stepi cuando estabas en llamada de suma() instrucción (es decir, => 0x08048403 <+40>: call 0x8048419 <sum>). los stepi las instrucciones te encaminan dentro del sum().

ingrese la descripción de la imagen aquí

Si lo haces nexti cuando estabas en llamada de suma() instrucción (es decir, => 0x08048403 <+40>: call 0x8048419 <sum>), luego usa el valor devuelto del método de suma y pasa a la siguiente instrucción del método principal, captura de pantalla como se muestra a continuación.

ingrese la descripción de la imagen aquí

Conclusión: Usar stepi si desea ver todas las instrucciones de máquina que sucedieron en su procesador. Usar nexti si desea ver solo las instrucciones de la máquina ejecutadas en el main().

  • Es similar a los comandos paso a paso y paso a paso de depuración de MSVS. “Pasar por encima” nunca aumentará la pila de llamadas (pero puede reducirse si realiza un paso por encima al final del método). Step-into saltará ansiosamente a la siguiente línea de código depurable, ya sea “esto” o una llamada de función anidada.

    – Ivan_Bereziuk

    5 de mayo a las 8:56

avatar de usuario de poige
poige

la diferencia es como call se trata:

  • stepi se sumerge en call
  • nexti carreras call pero no te guía a través de su código

Por lo tanto, aquí está la regla semántica para recordarlo mejor: debes paso si lo necesitas ensayar

¿Ha sido útil esta solución?