Shell   22-03-2024, 13:12
#1
Buenas!.

Tengo dos breakpoints ( o puntos de ruptura ) en un ejemplo:

[Imagen: uVJX4RA.png]

Si pulso la tecla F5, el flujo de ejecución del programa se para en la línea 17.
Si vuelvo a pulsar la tecla F5, se vuelve a ejecutar un ciclo del bucle While
y vuelve a la línea 17, pero no pasa al siguiente punto de ruptura en la línea 22.

¿ Es posible saltar de un punto de interrupción al siguiente punto de interrupción ?.

Tampoco podemos decirle al editor usando el menú contextual, ejecutar hasta la línea 22, ya que
se para antes en la línea 17.

F5 parece que ejecuta hasta el breakpoint. Si, sabemos que es un bucle que esto se ejecuta
varias veces, pero la ejecución podría termina en el siguiente punto de interrupción.

En depuración tenemos:

F8 - Paso a paso.
MAY + F8 - Paso entre procesos. ( Y esto tiene truco, ya que puede cambiar el comportamiento del salto si antes has usado F8 ).
Dependiendo a veces, F8 y MAY + F8 se puede comportar igual en determinados momentos

F5 - Ejecutar

Poco más. Quitando pausa y parada.

Otro ejemplo. Tenemos esto:

Código:
Public Sub Form_Open()

  Print "Instrucción 1 en Form Open"
  Print "Instrucción 2 en Form Open"
  Procedimiento1()

End

Public Sub Procedimiento1()

  Print "Instrucción 1 en Procedimiento1"
  Print "Instrucción 2 en Procedimiento1"
  Procedimiento2()

End

Public Sub Procedimiento2()

  Print "Instrucción 1 en Procedimiento2"
  Print "Instrucción 2 en Procedimiento2"
  Procedimiento3()

End

Public Sub Procedimiento3()

  Print "Instrucción 1 en Procedimiento3"
  Print "Instrucción 2 en Procedimiento3"
  Terminar()

End

Public Sub Terminar()

  Print "Hemos terminado!"

End

F8 - Va paso a paso por cada uno de los saltos, hasta llegar al procedimiento Terminar
MAY + F8: Al principio se comporta como F8. Solo hasta que encuentra el primer salto entre los procedimientos.
Ejecuta el primer procedimiento y cuando llega al procedimiento 1, ejecuta todo, sin pararse
( Creía que iría de un procedimiento a otro ). Por otra parte en esos procedimientos hay saltos.

Si comentamos uno de los saltos a los procedimientos, ejemplo en el Procedimiento 2.

Código:
....
Public Sub Procedimiento2()

  Print "Instrucción 1 en Procedimiento2"
  Print "Instrucción 2 en Procedimiento2"
  'Procedimiento3()

End
....

MAY + F8

Se comporta al principio como F8 y luego finaliza en la última línea del Procedimiento 2.

Ahora bien. Pongamos un punto de ruptura en cada salto a los procedimiento.
Ejecutamos. Primera parada en la llamada al procedimiento1. Ahora usamos MAY + F8.

Va saltando entre puntos de interrupción y hace algo curioso al final.
Cuando llega a llamar al procedimiento Terminar, este se ejecuta, se ve la salida en la consola.
(Pero no para en este, el cursor de ejecución)

"Y" su siguiente parada "es" el final de la última llamada. (End del Procedimento 3), va "reculando"
a cada End de los procedimientos anteriores y se finaliza. Lo que seria, vaciando la pila de llamadas.


La verdad es que esperaba que saltase entre puntos de interrupción en el ejemplo del bucle con la tecla F5.
 

¿ Es el comportamiento habitual de la pila de llamadas ?. ( ¿ En cualquier aplicación ?)
Recular hasta el primero procedimiento que se realizó una llamada.

Lo que en parte pregunto esto es por este motivo:

Si creamos un punto de ruptura en un bucle que tiene que realizar un número de pasos que pueden ser muchos.
Podemos estar pendiente de que acabe para ver algo, o tengamos que pararlo nosotros mismos. ( Hartos de esperar ).

Saludos
Última modificación: 22-03-2024, 13:26 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
Shell   22-03-2024, 14:43
#2
Otro ejemplo más.

El salto entre puntos de interrupción no se comporta igual en un bucle While que un bucle For.

Código:
Private numeros As New Integer[]

Public Sub Form_Open()

  Randomize

  numeros = LLenarArrayConNumeros()
  numeros = IntercambiarValores(numeros)

End

Public Function LLenarArrayConNumeros() As Integer[]

  Dim tarray As New Integer[]

  For j As Integer = 0 To 9
    'tarray.Add(Rand(1, 9))
    tarray.Add(j)
  Next

  Return tarray

End

' Public Sub IntercambiarValores(avalores As Integer[]) As Integer[]
'
'   Dim j As Integer
'
'   'Intercambiar valores en los indices
'   '0 -> 5
'   '1 -> 6
'   '2 -> 7
'   '3 -> 8
'   '4 -> 9
'   '....
'
'   j = 1
'   While j <= avalores.Max \ 2 + 1
'     Swap avalores[j - 1], avalores[avalores.Max / 2 + j]
'     Inc j
'   Wend
'
'   Return avalores
'
' End

Public Sub IntercambiarValores(avalores As Integer[]) As Integer[]

  For j As Integer = 1 To avalores.Max \ 2 + 1
    Swap avalores[j - 1], avalores[avalores.max \ 2 + j]
  Next

  Return avalores

End

Coloco un punto de interrupción en el mismo For y otro en el Return avalores.
Ejecuto con F5. Va a la linea donde se encuentra el For y luego vuelvo a pulsar F5,
y esta vez, va directo a Return avalores.

( Había algo mal en el código, ahora ya funciona bien..usando el depurador )

Saludos
Última modificación: 22-03-2024, 15:20 por Shell.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
  
Usuarios navegando en este tema: 1 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.