Chez ouam

/home/jmfrouin

View on GitHub
6 February 2013

Techniques de debug en C++ sous GNU/Linux

by Jean-Michel Frouin

Points d'arrêt dans une librairie partagée sous GNU/Linux

Il est possible de débugger les librairies partagées en utilisant l'interruption 3 en mode DEBUG.
Pour ce faire il suffit d'insérer : asm("int3"); à l'endroit où le point d'arrêt doit être posé.
Ensuite lors de l'exécution du programme dans gdb, il s'arrêtera automatiquement sur le point d'arrêt permettant ainsi de débugger la librairie partagée.
Si le programme est lancé normalement (ie sans debuggeur), le programme quittera avec le message d'erreur : Trappe pour point d'arrêt et de trace (En tout cas avec GCC localisé en français version gcc (GCC) 4.1.2).

Il faudra donc penser à encadrer le point d'arrêt par un test, par exemple :

#ifdef DEBUG_SHARED_LIBRARIES
asm("int3");
#endif //DEBUG_SHARED_LIBRARIES

pour éviter que le programme quitte et vous fasse perdre du temps.

Et lancer cmake :

cmake -DDEBUG_SHARED_LIBRARIES=1 ../source/

Utiliser les macros de pré-compilation

Dans un fichier :

std::cerr << "[ERR] Pointeur nul. : Fichier " << __FILE__ << ", ligne " __LINE__ << '\n'; 

Indiquera sur la sortie d'erreur, le fichier et la ligne où le programme à planté.

Pour vérifier le numéro de compilateur:

#define VERSION_GCC (__GNUC__*10000+__GNUC_MINOR__*100+__GNUC_PATCHLEVEL__) 
// Vérifier que la version de GCC est supérieure à 4.0.0
#if VERSION_GCC > 30200

Cela peut servir aussi, à n'utiliser que certains fonctions / macros en fonction des versions les supportant.

Valeur de retour Linux

Les deux valeurs de retour (Nécessite l'en-tête $<$iostream$>$) de base de Linux pour le point de sortie :

return EXIT_SUCCESS;
return EXIT_FAILURE;

Obtenir la liste des symboles

L'outil nm fait cela.
L'option -C active le demangle permettant d'obtenir les symboles C++ de façon plus lisible.

nm -C file | egrep ' t ' | awk '{print $3}' | sort | uniq -c | sort -nr

Empreinte mémoire

Pour voir l'empreinte mémoire d'un processus il suffit d'aller dans /proc/PID/maps.
Les segments exécutables ne sont pas dupliqués. Les segments de données, eux, le sont.

tags: