¿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
Aprende a usar GDB, el depurador de C
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!
Aprende a usar GDB, el depurador de C
Aprende a usar GDB, el depurador de C
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
}
Aprende a usar GDB, el depurador de C
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;
}
Aprende a usar GDB, el depurador de C
bash$ gcc code.c -o code
bash$ ./code
Segmentation fault.
bash$
Aprende a usar GDB, el depurador de C
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

PDF
Chuleta de lenguaje C para principiantes
PDF
Instrucciones de control de salto
PPT
Scjp Jug Section 2 Flow Control
PDF
Encriptacion y crackmes_en_batch_desde_0_by_xassiz
RTF
Repaso c
TXT
Matrices
PPTX
DOCX
5.quinto ejercicio emu8086
Chuleta de lenguaje C para principiantes
Instrucciones de control de salto
Scjp Jug Section 2 Flow Control
Encriptacion y crackmes_en_batch_desde_0_by_xassiz
Repaso c
Matrices
5.quinto ejercicio emu8086

La actualidad más candente (17)

PDF
Estructura de un algoritmo en pseudocódigo
PPT
Operadores
PDF
Script de Punteros a Funciones
PDF
Ejemplo C++
DOCX
6.sexto ejercicio emu8086
PDF
Instrucciones de control repetitivas
PPT
Fpr Tema 5 www.fresymetal.com
PDF
Sentencias de control
PPTX
Sentencia de control
DOCX
3.tercer ejercicio emu8086
PPT
Clase lenguaje c
DOC
Cajero en C++
PDF
Punteros a Funciones en C
DOCX
Codigos
PDF
41 Php. Bucles For
PDF
Clase 6
PPTX
Estructura de un algoritmo en pseudocódigo
Operadores
Script de Punteros a Funciones
Ejemplo C++
6.sexto ejercicio emu8086
Instrucciones de control repetitivas
Fpr Tema 5 www.fresymetal.com
Sentencias de control
Sentencia de control
3.tercer ejercicio emu8086
Clase lenguaje c
Cajero en C++
Punteros a Funciones en C
Codigos
41 Php. Bucles For
Clase 6
Publicidad

Destacado (17)

PPT
Aku tidak-lebih-dulu-ke-surga
PPT
Li̇neer cebi̇r 02
PPT
Aneka ria-perkawinan
PDF
Fabdial solution brochure
PPT
Burung dengan-sebelah-sayap
PPS
Romen rakamları
PPT
RASYONEL SAYILAR
PPT
İNTEGRAL UYGULAMALARI
PPT
Karmaşık Sayılar
PPT
LİSE - POLİNOMLAR 1
PPT
Zeka soruları
PPT
PPT
Köklü ifadeler
PPT
Çarpanlara Ayırma
PPS
ONDALIK KESİRLER
PPT
LİSE - LOGARİTMA (SLAYT)
PPTX
Projecte socialització de llibres de texte
Aku tidak-lebih-dulu-ke-surga
Li̇neer cebi̇r 02
Aneka ria-perkawinan
Fabdial solution brochure
Burung dengan-sebelah-sayap
Romen rakamları
RASYONEL SAYILAR
İNTEGRAL UYGULAMALARI
Karmaşık Sayılar
LİSE - POLİNOMLAR 1
Zeka soruları
Köklü ifadeler
Çarpanlara Ayırma
ONDALIK KESİRLER
LİSE - LOGARİTMA (SLAYT)
Projecte socialització de llibres de texte
Publicidad

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

PDF
Programar en c
PDF
Funciones C (gnu/linux)
PDF
Creacion de shellcodes para Exploits en Linux/x86
DOCX
Instrucciones(raptor, java, c#)
DOCX
Instrucciones(raptor, java, c#)
DOCX
DOCX
Instrucciones(raptor, java, c#)
DOCX
Instrucciones(raptor, java, c#)
PPTX
Fundamentos de programación(1)
DOCX
Librerias de dev c++
DOCX
Lectura de cadenas en c
DOCX
Instrucciones(raptor, java, c#)
DOCX
bibliotecas c++
DOCX
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
DOCX
Librerias en-lenguaje-c
Programar en c
Funciones C (gnu/linux)
Creacion de shellcodes para Exploits en Linux/x86
Instrucciones(raptor, java, c#)
Instrucciones(raptor, java, c#)
Instrucciones(raptor, java, c#)
Instrucciones(raptor, java, c#)
Fundamentos de programación(1)
Librerias de dev c++
Lectura de cadenas en c
Instrucciones(raptor, java, c#)
bibliotecas c++
INVESTIGACION DE ELEMENTOS Y CODIGOS DE C++
Librerias en-lenguaje-c

Último (20)

PDF
Aprendizaje Emocionante - Begoña Ibarrola SM2 Ccesa007.pdf
PDF
La Formacion Universitaria en Nuevos Escenarios Ccesa007.pdf
PDF
Iniciación Al Aprendizaje Basado En Proyectos ABP Ccesa007.pdf
PDF
Házlo con Miedo - Scott Allan Ccesa007.pdf
PDF
Manual del Gobierno Escolar -MINEDUC.pdf
PDF
Introduccion a la Investigacion Cualitativa FLICK Ccesa007.pdf
PDF
Como usar el Cerebro en las Aulas SG2 NARCEA Ccesa007.pdf
PDF
El Genero y Nuestros Cerebros - Gina Ripon Ccesa007.pdf
PDF
Ernst Cassirer - Antropologia Filosofica.pdf
PDF
NOM-020-SSA-2025.pdf Para establecimientos de salud y el reconocimiento de l...
PDF
UNIDAD 2 | La noticia como género: Informar con precisión y criterio
PPTX
LAS MIGRACIONES E INVASIONES Y EL INICIO EDAD MEDIA
PDF
Modelo Educativo SUB 2023versión final.pdf
DOCX
TEXTO DE TRABAJO DE EDUCACION RELIGIOSA - PRIMER GRADO.docx
PDF
Uso de la Inteligencia Artificial en la IE.pdf
PPTX
PRESENTACIÓN SOBRE LA RELIGIÓN MUSULMANA Y LA FORMACIÓN DEL IMPERIO MUSULMAN
PDF
Ficha de Atencion a Estudiantes RE Ccesa007.pdf
PDF
Didáctica de las literaturas infantiles.
PDF
Ficha de Atencion a Padres de Familia IE Ccesa007.pdf
DOCX
Programa_Sintetico_Fase_4.docx 3° Y 4°..
Aprendizaje Emocionante - Begoña Ibarrola SM2 Ccesa007.pdf
La Formacion Universitaria en Nuevos Escenarios Ccesa007.pdf
Iniciación Al Aprendizaje Basado En Proyectos ABP Ccesa007.pdf
Házlo con Miedo - Scott Allan Ccesa007.pdf
Manual del Gobierno Escolar -MINEDUC.pdf
Introduccion a la Investigacion Cualitativa FLICK Ccesa007.pdf
Como usar el Cerebro en las Aulas SG2 NARCEA Ccesa007.pdf
El Genero y Nuestros Cerebros - Gina Ripon Ccesa007.pdf
Ernst Cassirer - Antropologia Filosofica.pdf
NOM-020-SSA-2025.pdf Para establecimientos de salud y el reconocimiento de l...
UNIDAD 2 | La noticia como género: Informar con precisión y criterio
LAS MIGRACIONES E INVASIONES Y EL INICIO EDAD MEDIA
Modelo Educativo SUB 2023versión final.pdf
TEXTO DE TRABAJO DE EDUCACION RELIGIOSA - PRIMER GRADO.docx
Uso de la Inteligencia Artificial en la IE.pdf
PRESENTACIÓN SOBRE LA RELIGIÓN MUSULMANA Y LA FORMACIÓN DEL IMPERIO MUSULMAN
Ficha de Atencion a Estudiantes RE Ccesa007.pdf
Didáctica de las literaturas infantiles.
Ficha de Atencion a Padres de Familia IE Ccesa007.pdf
Programa_Sintetico_Fase_4.docx 3° Y 4°..

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
  • 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
  • 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 }
  • 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; }
  • 53. bash$ gcc code.c -o code bash$ ./code Segmentation fault. bash$
  • 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