Sections
Débogage
Printing default gcc #define
gcc -dM -E -x c /dev/null
printf ne peut pas afficher __FLT_MIN__ avec %f, il faut utiliser %e.
En compilant glib avec l'option --enable-mem-profile=yes, on peut activer les fonctions g_mem_profile et g_mem_check
En utilisant libdmalloc-dev et (CFLAGS=-DUSE_DMALLOC, LIBS=lmalloc), on peut utiliser les déboggages de dmalloc. avec g_malloc, g_free.
Utiliser glib 1.2.10 et dmalloc 5.4.2
- Installation: apt-get install libdmalloc-dev
- Makefile,
Pour compiler les .c, ajouter le drapeau (CFLAGS): -DUSE_DMALLOC
Pour lier les .o, ajouter la bibliothèque (LIBS): -ldmalloc - Macro à définir après le #include <glib.h>,
/* g_malloc, g_malloc0, and g_free macros for memory allocations in glib/dmalloc */ #define MALLOC(size) malloc(size) #define ALLOC(type, size) malloc((unsigned)sizeof(type)*(size)) #define CALLOC(type, size) calloc((unsigned)sizeof(type), size) #define REALLOC(mem, type, size) realloc(mem, (unsigned)sizeof(type)*(size)) #define FREE(ptr) free(ptr)
- Activer le niveau de débogage de dmalloc, en ajoutant une fonction bash pour exécuter le résultat de dmalloc,
$ function do_dmalloc { eval "`command dmalloc -b $*`"; } $ do_dmalloc -l logfile high
- Compiler le programme, exécuter et afficher le fichier logfile
- Pour arrêter l'écriture du logfile:
$ dmalloc none
Type
Les types gint64 et guint64 doivent être traités différement avec printf.
Ne pas faire: printf("%d, %d", (gint64)1, (gint64)2); Utiliser %lld (long long) for gint64 and guint64. #include <glib.h> #include <stdio.h> int main(void) { printf("gint64 d: %d, %d\n", (gint64)1, (gint64)2); // prints: 1, 0 printf("guint64 d: %d, %d\n", (guint64)1, (guint64)2); // prints: 1, 0 printf("gint64 ld: %ld, %ld\n", (gint64)1, (gint64)2); // prints: 1, 0 printf("guint64 ld: %ld, %ld\n", (guint64)1, (guint64)2); // prints: 1, 0 printf("gint64 lld: %lld, %lld\n", (gint64)1, (gint64)2); // prints: 1, 2 printf("guint64 lld: %lld, %lld\n", (guint64)1, (guint64)2); // prints: 1, 2 return 0; }