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

  1. Installation: apt-get install libdmalloc-dev
  2. Makefile,
    Pour compiler les .c, ajouter le drapeau (CFLAGS): -DUSE_DMALLOC
    Pour lier les .o, ajouter la bibliothèque (LIBS): -ldmalloc
  3. 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)
    
  4. 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
  5. Compiler le programme, exécuter et afficher le fichier logfile
  6. 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;
}