Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/02/2013, à 15:40

henrid

[RESOLU] Utilisation gdb sur bibliothèque dynamique : cas simple en C

Bonjour,

J'ai un souci pour débugger une bibliothèque dynamique. Je suis parti d'un exemple très simple.
J'ai trois fichiers *.c :
- example.c (le fichier principal)
- addition.c
- multiplication.c
Mon propos est de mettre addition.c et multiplication.c en bibliothèque, puis d'utiliser gdb pour débugger.
Ca marche bien si je suis en bibliothèque statique ( .a), mais ça ne marche pas si j'utilise une bibliothèque dynamique (.so).

Voici le contenu de ces fichiers .c :

example.c :

#include "../include/header.h"

int main()
{
int result;
result = addition(1,2);
printf("addition result is : %d\n",result);
result = multiplication(3,2);
printf("multiplication result is :  %d\n",result);
}

addition.c :

int addition(int a,int b)
{
int result;
result = a + b;
return result;
}

multiplication.c :

int multiplication(int a, int b)
{
int result;
result = a * b;
return result;
}

voici les différentes étapes :

pour la bibliothèque statique :

gcc -c -g *.c                                        // creation des fichiers objets principal.o, addition.o, multiplication.o
ar -cr libhdemath.a addition.o multiplication.o      // creation de la bibliothèque statique libhdemath.a
sudo cp libhdemath2.a /usr/lib                       // copie de la bibliothèque vers le répertoire adéquate
gcc -g example.o -lhdemath -o example                // création de l'exécutable example 
gdb example                                          // lancement de gdb sur example 
info sources                                         // info sur la table des symboles

=> je retrouve mes trois fichiers .c
je peux alors débugger les fichiers de ma bibliothèque libhdemath.a.

pour la bibliothèque dynamique :

gcc -c -g *.c                                                   // creation des fichiers objets principal.o, addition.o, multiplication.o
gcc -g -o libhdemath2.so -shared  addition.o multiplication.o   // creation de la bibliothèque dynamique libhdemath2.so
sudo cp libhdemath2.so /usr/lib                                  // copie de la bibliothèque vers le répertoire adéquate
gcc -g example.o -lhdemath2 -o example                          // création de l'exécutable example (pas nécessaire de mettre -g je pense) 
gdb example                                                     // lancement de gdb sur example 
info sources                                                    // info sur les fichiers sources que je peux débugger

=> je ne retrouve que example.c
donc je ne peux pas débugger les fichiers de ma bibliothèque dynamique libhdemath2.So

Pourquoi ? Une idée ?
je voudrais utiliser gdb pour ma bibliothèque dynamique sad
A noter que si je fais une modif dans le fichier addition.c et que je relance le processus de création de bibliothèque dynamique et de mon exécutable example, je vois bien ma modif a l'exécution de example.

Merci pour votre aide

Dernière modification par henrid (Le 27/02/2013, à 12:54)

Hors ligne

#2 Le 27/02/2013, à 12:53

henrid

Re : [RESOLU] Utilisation gdb sur bibliothèque dynamique : cas simple en C

je crois que j'ai compris !
je poste, si jamais ça intéresse quelqu'un.
Contrairement à la librairie statique, la librairie dynamique est indépendante de l'exécutable. Elle est seulement chargée à l'appel d'une fonciton de la librairie.
Donc gdb ne voit pas son contenu tant que le programme ne l'a pas appelé.

falucid@fullanalyze:~/HDE_TESTS/MATHS/test1/src$ gdb example
GNU gdb (GDB) 7.1-ubuntu
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i486-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/falucid/HDE_TESTS/MATHS/test1/src/example...done.
(gdb) info sources
Source files for which symbols have been read in:



Source files for which symbols will be read in on demand:

/home/falucid/HDE_TESTS/MATHS/test1/src/example.c
(gdb) b addition.c:3
No source file named addition.c.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (addition.c:3) pending.
(gdb) run
Starting program: /home/falucid/HDE_TESTS/MATHS/test1/src/example 
-> entree main !

Breakpoint 1, addition (a=1, b=2) at addition.c:3
3	printf("-> HDE entree addition!\n");
(gdb) c
Continuing.
-> HDE entree addition!
-> HDE sortie addition!
addition result is : 3
-> HDE entree multiplication ! 
-> HDE sortie multiplication !
multiplication result is :  6

Program exited with code 036.
(gdb) info sources
Source files for which symbols have been read in:

/home/falucid/HDE_TESTS/MATHS/test1/src/addition.c

Source files for which symbols will be read in on demand:

/home/falucid/HDE_TESTS/MATHS/test1/src/example.c, /home/falucid/HDE_TESTS/MATHS/test1/src/multiplication.c
(gdb) 

je résouds cette demande.

Hors ligne