Herramientas de usuario

Herramientas del sitio


cpp-avanzado:gdb

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
cpp-avanzado:gdb [2021/06/20 01:13]
guty
cpp-avanzado:gdb [2021/06/20 01:20] (actual)
santo
Línea 85: Línea 85:
  
  
-Esto inicia a su vez una consola de gdb, en la cual podemos usar el comando ​`runque inicia y ejecuta nuestro programa. Como nuestro programa lee del teclado, allí mismo queda esperando los datos, y podemos ingresar los valores de entrada para nuestro programa. Al hacer todo esto obtenemos:+Esto inicia a su vez una consola de gdb, en la cual podemos usar el comando ​''​run'' ​que inicia y ejecuta nuestro programa. Como nuestro programa lee del teclado, allí mismo queda esperando los datos, y podemos ingresar los valores de entrada para nuestro programa. Al hacer todo esto obtenemos:
  
 <​code>​ <​code>​
Línea 107: Línea 107:
 </​code>​ </​code>​
  
-Ahora nuestro programa fue ejecutado por gdb hasta el error de ejecución, y vemos un mensaje muy similar al anterior. La clave es que ahora, aquí mismo, podemos utilizar el comando ​`wherepara que nos muestre un stack-trace,​ que indica todas las llamadas que se realizaron en el programa, con sus correspondientes números de línea, hasta el punto exacto donde ocurrió el error:+Ahora nuestro programa fue ejecutado por gdb hasta el error de ejecución, y vemos un mensaje muy similar al anterior. La clave es que ahora, aquí mismo, podemos utilizar el comando ​''​where'' ​para que nos muestre un stack-trace,​ que indica todas las llamadas que se realizaron en el programa, con sus correspondientes números de línea ​(solamente si se compiló con la opción -g: es muy importante compilar con esta opción, para poder ver los números de línea en gdb), hasta el punto exacto donde ocurrió el error:
  
  
Línea 121: Línea 121:
 Si leemos de abajo hacia arriba, el stack trace nos dice que se ingresó a la función main() y en la línea 15 de gdbtest.cpp se llamó a la siguiente función, que viendo la línea justo arriba resulta ser el ''​operator[]''​ (o sea, un acceso a vector) y ya caemos en código interno de la STL. Podemos ver las llamadas internas dentro de la STL, pero eso normalmente no nos interesa. Si leemos de abajo hacia arriba, el stack trace nos dice que se ingresó a la función main() y en la línea 15 de gdbtest.cpp se llamó a la siguiente función, que viendo la línea justo arriba resulta ser el ''​operator[]''​ (o sea, un acceso a vector) y ya caemos en código interno de la STL. Podemos ver las llamadas internas dentro de la STL, pero eso normalmente no nos interesa.
  
-La clave es que al correr esto, instantáneamente gdb nos dice sin perder tiempo la línea donde ocurrió el error en tiempo de ejecucción:​ fue en gdbtest.cpp:​15,​ al llamar al `operator[]de vector.+La clave es que al correr esto, instantáneamente gdb nos dice sin perder tiempo la línea donde ocurrió el error en tiempo de ejecucción:​ fue en gdbtest.cpp:​15,​ al llamar al ''​operator[]'' ​de vector.
  
-En nuestro caso particular la línea 15 era `suma += v[i] * v[i+1];, en el segundo for. Entonces, el error ocurrió al acceder al vector allí, lo que nos da una enorme pista sobre dónde podemos tener el acceso fuera de rango. Mirando con cuidado ese for, vemos que en la línea justo anterior deberíamos ir solamente hasta $n-1$ y no hasta $n$, porque vamos a acceder a $i+1$ y no solamente a $i$.+En nuestro caso particular la línea 15 era ''​suma += v[i] * v[i+1];'' ​, en el segundo for. Entonces, el error ocurrió al acceder al vector allí, lo que nos da una enorme pista sobre dónde podemos tener el acceso fuera de rango. Mirando con cuidado ese for, vemos que en la línea justo anterior deberíamos ir solamente hasta $n-1$ y no hasta $n$, porque vamos a acceder a $i+1$ y no solamente a $i$.
  
 Corrigiendo eso, nuestro programa funciona. Y gracias a gdb combinado con las opciones de compilación recomendadas (notar que si no, no hubiera ocurrido el error, ¡sería directamente una respuesta errónea!), podemos encontrar sin perder tiempo el lugar del bug. Corrigiendo eso, nuestro programa funciona. Y gracias a gdb combinado con las opciones de compilación recomendadas (notar que si no, no hubiera ocurrido el error, ¡sería directamente una respuesta errónea!), podemos encontrar sin perder tiempo el lugar del bug.
Línea 139: Línea 139:
 </​code>​ </​code>​
  
-Pero luego en lugar de directamente run, utilizamos+Pero luego en lugar de directamente ​''​run''​, utilizamos
  
 <​code>​ <​code>​
cpp-avanzado/gdb.1624151629.txt.gz · Última modificación: 2021/06/20 01:13 por guty