debian cpp
Techniques de debug en C++ sous GNU/Linux
Posted by Jean-Michel Frouin on .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.