es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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!

Tags:  , ,

Answer

  1. Avatar for 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 utilizando lldb, parece que el punto de interrupción se dispara antes de que se ejecute la función principal. El valor inicial asignado a i 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 variable i, 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 ejecutar main, esto explicaría por qué el punto de interrupción se disparó antes de que se le asignara un valor a la variable i.

    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 que main haya comenzado, establecer el punto de interrupción en i y continuar la ejecución del programa (continue). Si el punto de interrupción se dispara con el valor correcto de i, 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 a i, esto es poco probable que sea la causa del problema en este caso.

Comments are closed.