¿Por qué el depurador lldb asigna un valor cuando configuro un punto de interrupción de seguimiento?
En el siguiente código C:
#include <stdio.h>
int main(void)
{
unsigned i = 1;
while (i)
{
i <<= 1;
}
return 0;
}
Primero compilo con información de depuración de la siguiente manera: gcc -g single-step.c
Luego hago lldb a.out. Quiero ver qué está haciendo i, así que hago b main y run, después de lo cual establezco mi punto de ruptura para i: watchpoint set variable i. Sin embargo, cuando hago eso, lldb parece asignar un valor a la variable i, lo cual no debería suceder
Punto de interrupción creado: Watchpoint 1: addr = 0x16fdff498 size = 4 state = enabled type = w
declare @ ‘/Users/d1ff1cult/Documents/KUL 2021-2022/IW/oefenzitting-c/les8-debugging/examples/single-step.c:5’
watchpoint spec = ‘i’
new value: 53472
Le da a i un valor aparentemente completamente aleatorio, entonces ¿qué estoy haciendo mal?
Utilizo CLion para escribir mi código, pero esto también ocurre en la terminal de CLion y en la terminal de mi macOS. También estoy utilizando una Mac M1.
¡Gracias de antemano!
davy.ai
Basado en el fragmento de código C proporcionado y los pasos tomados para establecer un punto de interrupción en la variable
i
utilizandolldb
, parece que el punto de interrupción se dispara antes de que se ejecute la función principal. El valor inicial asignado ai
es 1, pero el mensaje del punto de interrupción muestra un valor de 53472, lo cual no se puede explicar de inmediato.Una posible razón para esto es que cuando
lldb
establece un punto de interrupción en la variablei
, requiere asignar memoria para almacenar información sobre el punto de interrupción (como la dirección, tamaño y otros metadatos). Esta asignación de memoria podría cambiar potencialmente las direcciones de memoria de las variables bajo observación. Dado que la asignación de memoria se realiza antes de ejecutarmain
, esto explicaría por qué el punto de interrupción se disparó antes de que se le asignara un valor a la variablei
.Para confirmar si este es el caso, se puede intentar establecer un punto de interrupción en la primera línea de
main
(breakpoint set --name main
) y ejecutar el programa (run
). Luego, después de quemain
haya comenzado, establecer el punto de interrupción eni
y continuar la ejecución del programa (continue
). Si el punto de interrupción se dispara con el valor correcto dei
, entonces la explicación anterior es probablemente correcta.Como observación adicional, también es posible que el valor inesperado de
i
se deba a memoria no inicializada. Cuando se declaran variables sin inicializarse, su valor inicial es indefinido y puede ser cualquier valor arbitrario. Sin embargo, dado que el fragmento de código asigna explícitamente un valor de 1 ai
, esto es poco probable que sea la causa del problema en este caso.