SlideShare una empresa de Scribd logo
1 de 67
Descargar para leer sin conexión
¿Por qué no funciona mi
práctica?
Aprende a usar el depurador de C: GDB
by @sgomez
¿Quién soy?
¿Quién soy?
Sergio Gómez @sgomez
KEEP

CALM

AND

SEGMENTATION

FAULT
KEEP

CALM

AND

AVOID

SEGMENTATION

FAULT
¿Cómo se produce un Segmentation Fault?
Básicamente al acceder a una zona de memoria
a la que no tenemos acceso.
¿Cómo se produce un Segmentation Fault?
Acceso a memoria de solo lectura
int main(void)
{
char *s = "hello world";
*s = 'H'; // Segfault
}
¿Cómo se produce un Segmentation Fault?
Acceso a memoria de solo lectura
int main(void)
{
char s[] = "hello world";
*s = 'H'; // OK
}
¿Cómo se produce un Segmentation Fault?
Referencias a punteros nulos
int main(void)
{
int *ptr = NULL;
printf("%d", *ptr); // Segfault
}
¿Cómo se produce un Segmentation Fault?
Desbordamiento de buffer
int main(void)
{
char A[8] = "";
unsigned short B = 1979;
strcpy(A, "excessive");
}
¿Cómo se produce un Segmentation Fault?
Desbordamiento de buffer
int main(void)
{
char A[8] = "";
unsigned short B = 1979;
strcpy(A, "excessive");
}
¿Cómo se produce un Segmentation Fault?
Desbordamiento de pila
int main(void)
{
main();
return 0;
}
int main(void)
{
char *ptr = (char *) malloc (sizeof(char) * 4);
}
¿Cuál es el tamaño en bytes del bloque de
memoria reservado para ptr?
4 bytes 5 bytes (4 + ‘/0’)
Más de 5 Ninguna es correcta
int main(void)
{
char *ptr = (char *) malloc (sizeof(char) * 4);
}
¿Cuál es el tamaño en bytes del bloque de
memoria reservado para ptr?
5 bytes (4 + ‘/0’)
Más de 5
int main(void)
{
char *ptr = (char *) malloc (sizeof(char) * 4);
}
¿Cuál es el tamaño en bytes del bloque de
memoria reservado para ptr?
Más de 5
Empezamos… ¡Tenemos un bug!
function keep_calm() {

printf (“KEEPn”);

printf (“CALMn”);

printf (“ANDn”);

keep_calm();

}
Razones para no usar
printf
Razones para no usar
printf
1) No es una herramienta de depuración
Razones para no usar
printf
1) No es una herramienta de depuración
2) Nos obliga a ir probando para acotar el fallo
Razones para no usar
printf
1) No es una herramienta de depuración
2) Nos obliga a ir probando para acotar el fallo
3) Nos puede engañar
int mi_funcion(int *array, char *array2) {
asdasdksdsajdhljkdhsdhasdSDasd
asdasdasdasdsadaddssadsadsadsdas
asdasdasdsadSDSDsdasdasdsad
daSDSADASDASDDDSDSADJKSHDKLJKSAHDJHJADHASD
ASDHASJDHKJASDHASKJDHAS
DASDJÑASKLDJAKSLDJÑALSKDJÑASKLDJASKDJAKSDJÑALSD
ASDÑKASDJÑLKASDJÑASKDJ
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
ASDKJÑDKLJasñkdljsñkdjasñkld
askljdskaidsajdksdjsakdñad
}
int mi_funcion(int *array, char *array2) {
asdasdksdsajdhljkdhsdhasdSDasd
printf(“A”);
asdasdasdasdsadaddssadsadsadsdas
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
daSDSADASDASDDDSDSADJKSHDKLJKSAHDJHJADHASD
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
DASDJÑASKLDJAKSLDJÑALSKDJÑASKLDJASKDJAKSDJÑALSD
ASDÑKASDJÑLKASDJÑASKDJ
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
ASDKJÑDKLJasñkdljsñkdjasñkld
askljdskaidsajdksdjsakdñad
}
bash$ gcc code.c -o code
bash$ gcc code.c -o code
bash$ ./code
bash$ gcc code.c -o code
bash$ ./code
AB
bash$ gcc code.c -o code
bash$ ./code
AB
Segmentation fault.
bash$ gcc code.c -o code
bash$ ./code
AB
Segmentation fault.
bash$
bash$ gcc code.c -o code
bash$ ./code
AB
Segmentation fault.
bash$
¿Dónde está el fallo?
Entre A y B Entre B y C
Entre C y D Ninguna es correcta
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
bash$ gcc code.c -o code
bash$ ./code
AB
Segmentation fault.
bash$
¿Dónde está el fallo?
Entre C y D Ninguna es correcta
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
bash$ gcc code.c -o code
bash$ ./code
AB
Segmentation fault.
bash$
¿Dónde está el fallo?
Ninguna es correcta
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A B
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A B
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
B
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
B
C
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
B
C D
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
B
C D
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
B
C D
printf usa el canal stdout
int mi_funcion(int *array,
char *array2) {
printf(“A”);
asdasdasdsadSDSDsdasdasdsad
printf(“B”);
ASDHASJDHKJASDHASKJDHAS
printf(“C”);
sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS
printf(“D”);
askljdskaidsajdksdjsakdñad
}
Buffer
Consola
A
B
Segmentation fault.
Para depuración se usa el
canal stderr
Para depuración se usa el
canal stderr
fprintf(stderr, …)
Razones para no usar
printf
1) No es una herramienta de depuración
2) Nos obliga a ir probando para acotar el fallo
3) Nos puede engañar
Razones para no usar
fprintf
1) No es una herramienta de depuración
2) Nos obliga a ir probando para acotar el fallo
3) Nos puede engañar
Ahora sí… gdb
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char* argv[])
{
int *s = NULL;
printf("A");
printf("B");
printf("%d", *s);
printf("C");
printf("D");
return 0;
}
bash$ gcc code.c -o code
bash$ ./code
Segmentation fault.
bash$
bash$ gcc code.c -o code -g
bash$ gcc code.c -o code -g
bash$ ./code
bash$ gcc code.c -o code -g
bash$ ./code
Segmentation fault.
bash$ gcc code.c -o code -g
bash$ ./code
Segmentation fault.
bash$ gdb code
bash$ gcc code.c -o code -g
bash$ ./code
Segmentation fault.
bash$ gdb code
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
bash$ gcc code.c -o code -g
bash$ ./code
Segmentation fault.
bash$ gdb code
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x08048439 in main (argc=1, argv=0xffffd364) at code.c:9
bash$ gcc code.c -o code -g
bash$ ./code
Segmentation fault.
bash$ gdb code
(gdb) run
Program received signal SIGSEGV, Segmentation fault.
0x08048439 in main (argc=1, argv=0xffffd364) at code.c:9
9 printf("%d", *s);
Órdenes usuales
- l, list Muestra las líneas de código
- b, break Crea un breakpoint
- d, delete Borra un breakpoint
- clear Borra uno o varios breakpoints
- info b Muestra la lista de breakpoints
- c, continue Continúa la ejecución
- n, next Ejecuta la siguiente línea
- s, step Como next pero entra en subrutinas
- display Muestra una expresión por parada
- print Muestra una expresión
- bt, where Muestra pila funciones (backtrace)
- set Asigna un valor a una variable
¿Verdadero o Falso?
Verdadero Falso
int main(int argc, char const *argv[])
{
if ( 0.1 + 0.2 == 0.3 ) {
puts ("Verdadero");
} else {
puts ("Falso");
}
return 0;
}
Segmentation Fault Ninguna es correcta
¿Verdadero o Falso?
Falso
int main(int argc, char const *argv[])
{
if ( 0.1 + 0.2 == 0.3 ) {
puts ("Verdadero");
} else {
puts ("Falso");
}
return 0;
}
Consejos
- Siempre inicializar las variables. SIEMPRE.



int i = 0;

for (i = 0; i < 10; i++);

- Usar calloc mejor que malloc.



int *ptr = (int *) malloc (sizeof(int) * 15);

int *ptr = (int ) calloc (15, sizeof(int));

Consejos- Código limpio, máximo 80 caracteres por linea.



printf(“%s %s %s”, game->player[1]->score, game-
>player[1]->highscore, game->player[1]->name);



printf(“%s %s %s”, 

game->player[1]->score, 

game->player[1]->highscore, 

game->player[1]->name

);



- En las comparaciones, las constantes primero



if (variable = 6) {} // Compila

if (6 = variable) {} // No compila

if (6 == variable) {} // Correcto
¿Por qué no funciona mi
práctica?
Aprende a usar el depurador de C: GDB
by @sgomez

Más contenido relacionado

La actualidad más candente

Estructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigoEstructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigoAbrirllave
 
Script de Punteros a Funciones
Script de Punteros a FuncionesScript de Punteros a Funciones
Script de Punteros a FuncionesAnesGy SD
 
Ejemplo C++
Ejemplo C++Ejemplo C++
Ejemplo C++David
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivasAbrirllave
 
Fpr Tema 5 www.fresymetal.com
Fpr Tema 5 www.fresymetal.comFpr Tema 5 www.fresymetal.com
Fpr Tema 5 www.fresymetal.comFresyMetal
 
Sentencia de control
Sentencia de controlSentencia de control
Sentencia de controlStalyn Cruz
 
Clase lenguaje c
Clase lenguaje c Clase lenguaje c
Clase lenguaje c Mar15marian
 
Cajero en C++
Cajero en C++Cajero en C++
Cajero en C++IngridBs
 
Punteros a Funciones en C
Punteros a Funciones en CPunteros a Funciones en C
Punteros a Funciones en CAnesGy SD
 

La actualidad más candente (17)

Estructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigoEstructura de un algoritmo en pseudocódigo
Estructura de un algoritmo en pseudocódigo
 
Operadores
OperadoresOperadores
Operadores
 
Script de Punteros a Funciones
Script de Punteros a FuncionesScript de Punteros a Funciones
Script de Punteros a Funciones
 
Ejemplo C++
Ejemplo C++Ejemplo C++
Ejemplo C++
 
6.sexto ejercicio emu8086
6.sexto ejercicio emu80866.sexto ejercicio emu8086
6.sexto ejercicio emu8086
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivas
 
Fpr Tema 5 www.fresymetal.com
Fpr Tema 5 www.fresymetal.comFpr Tema 5 www.fresymetal.com
Fpr Tema 5 www.fresymetal.com
 
Sentencias de control
Sentencias de controlSentencias de control
Sentencias de control
 
Sentencia de control
Sentencia de controlSentencia de control
Sentencia de control
 
3.tercer ejercicio emu8086
3.tercer ejercicio emu80863.tercer ejercicio emu8086
3.tercer ejercicio emu8086
 
Clase lenguaje c
Clase lenguaje c Clase lenguaje c
Clase lenguaje c
 
Cajero en C++
Cajero en C++Cajero en C++
Cajero en C++
 
Punteros a Funciones en C
Punteros a Funciones en CPunteros a Funciones en C
Punteros a Funciones en C
 
Codigos
CodigosCodigos
Codigos
 
41 Php. Bucles For
41 Php. Bucles For41 Php. Bucles For
41 Php. Bucles For
 
Clase 6
Clase 6Clase 6
Clase 6
 
Estructura switch case
Estructura switch caseEstructura switch case
Estructura switch case
 

Destacado (17)

Aku tidak-lebih-dulu-ke-surga
Aku tidak-lebih-dulu-ke-surgaAku tidak-lebih-dulu-ke-surga
Aku tidak-lebih-dulu-ke-surga
 
Li̇neer cebi̇r 02
Li̇neer cebi̇r 02Li̇neer cebi̇r 02
Li̇neer cebi̇r 02
 
Aneka ria-perkawinan
Aneka ria-perkawinanAneka ria-perkawinan
Aneka ria-perkawinan
 
Fabdial solution brochure
Fabdial   solution brochureFabdial   solution brochure
Fabdial solution brochure
 
Burung dengan-sebelah-sayap
Burung dengan-sebelah-sayapBurung dengan-sebelah-sayap
Burung dengan-sebelah-sayap
 
Romen rakamları
Romen rakamlarıRomen rakamları
Romen rakamları
 
RASYONEL SAYILAR
RASYONEL SAYILARRASYONEL SAYILAR
RASYONEL SAYILAR
 
İNTEGRAL UYGULAMALARI
İNTEGRAL UYGULAMALARIİNTEGRAL UYGULAMALARI
İNTEGRAL UYGULAMALARI
 
Karmaşık Sayılar
Karmaşık SayılarKarmaşık Sayılar
Karmaşık Sayılar
 
LİSE - POLİNOMLAR 1
LİSE - POLİNOMLAR 1LİSE - POLİNOMLAR 1
LİSE - POLİNOMLAR 1
 
Zeka soruları
Zeka sorularıZeka soruları
Zeka soruları
 
Türev 01
Türev 01Türev 01
Türev 01
 
Köklü ifadeler
Köklü ifadelerKöklü ifadeler
Köklü ifadeler
 
Çarpanlara Ayırma
Çarpanlara AyırmaÇarpanlara Ayırma
Çarpanlara Ayırma
 
ONDALIK KESİRLER
ONDALIK KESİRLERONDALIK KESİRLER
ONDALIK KESİRLER
 
LİSE - LOGARİTMA (SLAYT)
LİSE - LOGARİTMA (SLAYT)LİSE - LOGARİTMA (SLAYT)
LİSE - LOGARİTMA (SLAYT)
 
Projecte socialització de llibres de texte
Projecte socialització de llibres de texteProjecte socialització de llibres de texte
Projecte socialització de llibres de texte
 

Similar a Aprende a usar GDB, el depurador de C

Trampas en c ++
Trampas en c ++Trampas en c ++
Trampas en c ++DTQ4
 
El lenguaje de programacion c++ prev
El lenguaje de programacion c++ prevEl lenguaje de programacion c++ prev
El lenguaje de programacion c++ prevjtk1
 
(Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++ (Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++ Eli Diaz
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenashorusblom
 
Expo_Int
Expo_IntExpo_Int
Expo_IntRogDer
 
Unidad16 Codigof1
Unidad16 Codigof1Unidad16 Codigof1
Unidad16 Codigof1martha leon
 
Ejemplos Importantisimo
Ejemplos  ImportantisimoEjemplos  Importantisimo
Ejemplos Importantisimomartha leon
 
El lenguaje c
El lenguaje cEl lenguaje c
El lenguaje cjoeshego
 
Bucles anidados 2012
Bucles anidados 2012Bucles anidados 2012
Bucles anidados 2012Gabii Méndez
 
Lenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptosLenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptosmellcv
 

Similar a Aprende a usar GDB, el depurador de C (20)

Trampas en c ++
Trampas en c ++Trampas en c ++
Trampas en c ++
 
El lenguaje de programacion c++ prev
El lenguaje de programacion c++ prevEl lenguaje de programacion c++ prev
El lenguaje de programacion c++ prev
 
(Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++ (Meta 5.1)función sin parámetros que no retorna valor dev c++
(Meta 5.1)función sin parámetros que no retorna valor dev c++
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Codigos de programas
Codigos de programasCodigos de programas
Codigos de programas
 
Javaintroduccion 2010
Javaintroduccion 2010Javaintroduccion 2010
Javaintroduccion 2010
 
Tipos basicos de java
Tipos basicos de javaTipos basicos de java
Tipos basicos de java
 
Laboratorio1 entrada-salida de datos / Lenguance C
Laboratorio1   entrada-salida de datos / Lenguance CLaboratorio1   entrada-salida de datos / Lenguance C
Laboratorio1 entrada-salida de datos / Lenguance C
 
08 strings o cadenas
08 strings o cadenas08 strings o cadenas
08 strings o cadenas
 
Apunfun2
Apunfun2Apunfun2
Apunfun2
 
Expo_Int
Expo_IntExpo_Int
Expo_Int
 
Unidad16 Codigof1
Unidad16 Codigof1Unidad16 Codigof1
Unidad16 Codigof1
 
Ejemplos Importantisimo
Ejemplos  ImportantisimoEjemplos  Importantisimo
Ejemplos Importantisimo
 
El lenguaje c
El lenguaje cEl lenguaje c
El lenguaje c
 
Bucles anidados 2012
Bucles anidados 2012Bucles anidados 2012
Bucles anidados 2012
 
Charla Mysql
Charla MysqlCharla Mysql
Charla Mysql
 
Lenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptosLenguaje de programacion java, conceptos
Lenguaje de programacion java, conceptos
 
03 iteracion
03 iteracion03 iteracion
03 iteracion
 
MéTodos Java
MéTodos JavaMéTodos Java
MéTodos Java
 

Último

PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxOscarEduardoSanchezC
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfromanmillans
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PCCesarFernandez937857
 
Lecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadLecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadAlejandrino Halire Ccahuana
 
Plan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPEPlan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPELaura Chacón
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFAROJosé Luis Palma
 
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.pptDE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.pptELENA GALLARDO PAÚLS
 
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdfOswaldoGonzalezCruz
 
Factores ecosistemas: interacciones, energia y dinamica
Factores ecosistemas: interacciones, energia y dinamicaFactores ecosistemas: interacciones, energia y dinamica
Factores ecosistemas: interacciones, energia y dinamicaFlor Idalia Espinoza Ortega
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleJonathanCovena1
 
plan-de-trabajo-colegiado en una institucion educativa
plan-de-trabajo-colegiado en una institucion educativaplan-de-trabajo-colegiado en una institucion educativa
plan-de-trabajo-colegiado en una institucion educativafiorelachuctaya2
 
Flores Nacionales de América Latina - Botánica
Flores Nacionales de América Latina - BotánicaFlores Nacionales de América Latina - Botánica
Flores Nacionales de América Latina - BotánicaJuan Carlos Fonseca Mata
 
Análisis de la Implementación de los Servicios Locales de Educación Pública p...
Análisis de la Implementación de los Servicios Locales de Educación Pública p...Análisis de la Implementación de los Servicios Locales de Educación Pública p...
Análisis de la Implementación de los Servicios Locales de Educación Pública p...Baker Publishing Company
 
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...JAVIER SOLIS NOYOLA
 
Fundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdfFundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdfsamyarrocha1
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Carlos Muñoz
 

Último (20)

PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptxPPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
PPT GESTIÓN ESCOLAR 2024 Comités y Compromisos.pptx
 
Estrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdfEstrategia de Enseñanza y Aprendizaje.pdf
Estrategia de Enseñanza y Aprendizaje.pdf
 
Identificación de componentes Hardware del PC
Identificación de componentes Hardware del PCIdentificación de componentes Hardware del PC
Identificación de componentes Hardware del PC
 
Lecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdadLecciones 04 Esc. Sabática. Defendamos la verdad
Lecciones 04 Esc. Sabática. Defendamos la verdad
 
Plan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPEPlan Año Escolar Año Escolar 2023-2024. MPPE
Plan Año Escolar Año Escolar 2023-2024. MPPE
 
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARONARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
NARRACIONES SOBRE LA VIDA DEL GENERAL ELOY ALFARO
 
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.pptDE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
DE LAS OLIMPIADAS GRIEGAS A LAS DEL MUNDO MODERNO.ppt
 
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
5° SEM29 CRONOGRAMA PLANEACIÓN DOCENTE DARUKEL 23-24.pdf
 
Factores ecosistemas: interacciones, energia y dinamica
Factores ecosistemas: interacciones, energia y dinamicaFactores ecosistemas: interacciones, energia y dinamica
Factores ecosistemas: interacciones, energia y dinamica
 
Power Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptxPower Point: "Defendamos la verdad".pptx
Power Point: "Defendamos la verdad".pptx
 
Introducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo SostenibleIntroducción:Los objetivos de Desarrollo Sostenible
Introducción:Los objetivos de Desarrollo Sostenible
 
Unidad 4 | Teorías de las Comunicación | MCDI
Unidad 4 | Teorías de las Comunicación | MCDIUnidad 4 | Teorías de las Comunicación | MCDI
Unidad 4 | Teorías de las Comunicación | MCDI
 
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdfTema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
Tema 7.- E-COMMERCE SISTEMAS DE INFORMACION.pdf
 
plan-de-trabajo-colegiado en una institucion educativa
plan-de-trabajo-colegiado en una institucion educativaplan-de-trabajo-colegiado en una institucion educativa
plan-de-trabajo-colegiado en una institucion educativa
 
Flores Nacionales de América Latina - Botánica
Flores Nacionales de América Latina - BotánicaFlores Nacionales de América Latina - Botánica
Flores Nacionales de América Latina - Botánica
 
Análisis de la Implementación de los Servicios Locales de Educación Pública p...
Análisis de la Implementación de los Servicios Locales de Educación Pública p...Análisis de la Implementación de los Servicios Locales de Educación Pública p...
Análisis de la Implementación de los Servicios Locales de Educación Pública p...
 
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
LA ECUACIÓN DEL NÚMERO PI EN LOS JUEGOS OLÍMPICOS DE PARÍS. Por JAVIER SOLIS ...
 
Fundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdfFundamentos y Principios de Psicopedagogía..pdf
Fundamentos y Principios de Psicopedagogía..pdf
 
Repaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia GeneralRepaso Pruebas CRECE PR 2024. Ciencia General
Repaso Pruebas CRECE PR 2024. Ciencia General
 
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
Plan Refuerzo Escolar 2024 para estudiantes con necesidades de Aprendizaje en...
 

Aprende a usar GDB, el depurador de C

  • 1. ¿Por qué no funciona mi práctica? Aprende a usar el depurador de C: GDB by @sgomez
  • 4.
  • 7. ¿Cómo se produce un Segmentation Fault? Básicamente al acceder a una zona de memoria a la que no tenemos acceso.
  • 8. ¿Cómo se produce un Segmentation Fault? Acceso a memoria de solo lectura int main(void) { char *s = "hello world"; *s = 'H'; // Segfault }
  • 9. ¿Cómo se produce un Segmentation Fault? Acceso a memoria de solo lectura int main(void) { char s[] = "hello world"; *s = 'H'; // OK }
  • 10. ¿Cómo se produce un Segmentation Fault? Referencias a punteros nulos int main(void) { int *ptr = NULL; printf("%d", *ptr); // Segfault }
  • 11. ¿Cómo se produce un Segmentation Fault? Desbordamiento de buffer int main(void) { char A[8] = ""; unsigned short B = 1979; strcpy(A, "excessive"); }
  • 12. ¿Cómo se produce un Segmentation Fault? Desbordamiento de buffer int main(void) { char A[8] = ""; unsigned short B = 1979; strcpy(A, "excessive"); }
  • 13. ¿Cómo se produce un Segmentation Fault? Desbordamiento de pila int main(void) { main(); return 0; }
  • 14. int main(void) { char *ptr = (char *) malloc (sizeof(char) * 4); } ¿Cuál es el tamaño en bytes del bloque de memoria reservado para ptr? 4 bytes 5 bytes (4 + ‘/0’) Más de 5 Ninguna es correcta
  • 15. int main(void) { char *ptr = (char *) malloc (sizeof(char) * 4); } ¿Cuál es el tamaño en bytes del bloque de memoria reservado para ptr? 5 bytes (4 + ‘/0’) Más de 5
  • 16. int main(void) { char *ptr = (char *) malloc (sizeof(char) * 4); } ¿Cuál es el tamaño en bytes del bloque de memoria reservado para ptr? Más de 5
  • 18.
  • 19.
  • 20. function keep_calm() { printf (“KEEPn”); printf (“CALMn”); printf (“ANDn”); keep_calm(); }
  • 21. Razones para no usar printf
  • 22. Razones para no usar printf 1) No es una herramienta de depuración
  • 23. Razones para no usar printf 1) No es una herramienta de depuración 2) Nos obliga a ir probando para acotar el fallo
  • 24. Razones para no usar printf 1) No es una herramienta de depuración 2) Nos obliga a ir probando para acotar el fallo 3) Nos puede engañar
  • 25. int mi_funcion(int *array, char *array2) { asdasdksdsajdhljkdhsdhasdSDasd asdasdasdasdsadaddssadsadsadsdas asdasdasdsadSDSDsdasdasdsad daSDSADASDASDDDSDSADJKSHDKLJKSAHDJHJADHASD ASDHASJDHKJASDHASKJDHAS DASDJÑASKLDJAKSLDJÑALSKDJÑASKLDJASKDJAKSDJÑALSD ASDÑKASDJÑLKASDJÑASKDJ sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS ASDKJÑDKLJasñkdljsñkdjasñkld askljdskaidsajdksdjsakdñad }
  • 26. int mi_funcion(int *array, char *array2) { asdasdksdsajdhljkdhsdhasdSDasd printf(“A”); asdasdasdasdsadaddssadsadsadsdas asdasdasdsadSDSDsdasdasdsad printf(“B”); daSDSADASDASDDDSDSADJKSHDKLJKSAHDJHJADHASD ASDHASJDHKJASDHASKJDHAS printf(“C”); DASDJÑASKLDJAKSLDJÑALSKDJÑASKLDJASKDJAKSDJÑALSD ASDÑKASDJÑLKASDJÑASKDJ sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); ASDKJÑDKLJasñkdljsñkdjasñkld askljdskaidsajdksdjsakdñad }
  • 27.
  • 28. bash$ gcc code.c -o code
  • 29. bash$ gcc code.c -o code bash$ ./code
  • 30. bash$ gcc code.c -o code bash$ ./code AB
  • 31. bash$ gcc code.c -o code bash$ ./code AB Segmentation fault.
  • 32. bash$ gcc code.c -o code bash$ ./code AB Segmentation fault. bash$
  • 33. bash$ gcc code.c -o code bash$ ./code AB Segmentation fault. bash$ ¿Dónde está el fallo? Entre A y B Entre B y C Entre C y D Ninguna es correcta int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad }
  • 34. bash$ gcc code.c -o code bash$ ./code AB Segmentation fault. bash$ ¿Dónde está el fallo? Entre C y D Ninguna es correcta int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad }
  • 35. bash$ gcc code.c -o code bash$ ./code AB Segmentation fault. bash$ ¿Dónde está el fallo? Ninguna es correcta int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad }
  • 36. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola
  • 37. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A
  • 38. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B
  • 39. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B
  • 40. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B
  • 41. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B C
  • 42. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B C D
  • 43. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B C D
  • 44. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B C D
  • 45. printf usa el canal stdout int mi_funcion(int *array, char *array2) { printf(“A”); asdasdasdsadSDSDsdasdasdsad printf(“B”); ASDHASJDHKJASDHASKJDHAS printf(“C”); sadkjadsÑKLjdsadkalsdjñlaskjdñaskldjñalS printf(“D”); askljdskaidsajdksdjsakdñad } Buffer Consola A B Segmentation fault.
  • 46. Para depuración se usa el canal stderr
  • 47. Para depuración se usa el canal stderr fprintf(stderr, …)
  • 48. Razones para no usar printf 1) No es una herramienta de depuración 2) Nos obliga a ir probando para acotar el fallo 3) Nos puede engañar
  • 49. Razones para no usar fprintf 1) No es una herramienta de depuración 2) Nos obliga a ir probando para acotar el fallo 3) Nos puede engañar
  • 51. #include <stdlib.h> #include <stdio.h> int main (int argc, char* argv[]) { int *s = NULL; printf("A"); printf("B"); printf("%d", *s); printf("C"); printf("D"); return 0; }
  • 52.
  • 53. bash$ gcc code.c -o code bash$ ./code Segmentation fault. bash$
  • 54.
  • 55. bash$ gcc code.c -o code -g
  • 56. bash$ gcc code.c -o code -g bash$ ./code
  • 57. bash$ gcc code.c -o code -g bash$ ./code Segmentation fault.
  • 58. bash$ gcc code.c -o code -g bash$ ./code Segmentation fault. bash$ gdb code
  • 59. bash$ gcc code.c -o code -g bash$ ./code Segmentation fault. bash$ gdb code (gdb) run Program received signal SIGSEGV, Segmentation fault.
  • 60. bash$ gcc code.c -o code -g bash$ ./code Segmentation fault. bash$ gdb code (gdb) run Program received signal SIGSEGV, Segmentation fault. 0x08048439 in main (argc=1, argv=0xffffd364) at code.c:9
  • 61. bash$ gcc code.c -o code -g bash$ ./code Segmentation fault. bash$ gdb code (gdb) run Program received signal SIGSEGV, Segmentation fault. 0x08048439 in main (argc=1, argv=0xffffd364) at code.c:9 9 printf("%d", *s);
  • 62. Órdenes usuales - l, list Muestra las líneas de código - b, break Crea un breakpoint - d, delete Borra un breakpoint - clear Borra uno o varios breakpoints - info b Muestra la lista de breakpoints - c, continue Continúa la ejecución - n, next Ejecuta la siguiente línea - s, step Como next pero entra en subrutinas - display Muestra una expresión por parada - print Muestra una expresión - bt, where Muestra pila funciones (backtrace) - set Asigna un valor a una variable
  • 63. ¿Verdadero o Falso? Verdadero Falso int main(int argc, char const *argv[]) { if ( 0.1 + 0.2 == 0.3 ) { puts ("Verdadero"); } else { puts ("Falso"); } return 0; } Segmentation Fault Ninguna es correcta
  • 64. ¿Verdadero o Falso? Falso int main(int argc, char const *argv[]) { if ( 0.1 + 0.2 == 0.3 ) { puts ("Verdadero"); } else { puts ("Falso"); } return 0; }
  • 65. Consejos - Siempre inicializar las variables. SIEMPRE.
 
 int i = 0;
 for (i = 0; i < 10; i++);
 - Usar calloc mejor que malloc.
 
 int *ptr = (int *) malloc (sizeof(int) * 15);
 int *ptr = (int ) calloc (15, sizeof(int));

  • 66. Consejos- Código limpio, máximo 80 caracteres por linea.
 
 printf(“%s %s %s”, game->player[1]->score, game- >player[1]->highscore, game->player[1]->name);
 
 printf(“%s %s %s”, 
 game->player[1]->score, 
 game->player[1]->highscore, 
 game->player[1]->name
 );
 
 - En las comparaciones, las constantes primero
 
 if (variable = 6) {} // Compila
 if (6 = variable) {} // No compila
 if (6 == variable) {} // Correcto
  • 67. ¿Por qué no funciona mi práctica? Aprende a usar el depurador de C: GDB by @sgomez