component_create() - initialisation

Re: component_create() - initialisation

by Jean-Cédric Chappelier -
Number of replies: 3

les tests unitaires lancent en effet un nouveau sous-process par test (fork()) et c'est donc plus difficile à suivre. Si vous souhaitez debogguer avec gdb les programme de tests (mais Yassin a raison !), voici quelques conseils :

  • mettez ces options dans gdb :
    set follow-fork-mode child
    set detach-on-fork off
  • suivez dans quel sous-process vous êtes avec
    info infe
  • change de process avec infe + numéro; p.ex. :
    infe 1
  • ne mettez pas de breakpoints sur le code des unit-test-* eux-mêmes (car ils sont écrit avec des macros en fait) mais sur votre « vrai » code C à vous.
Exemple sur votre question :
c'est dans le 5e test que vous avez des problèmes. Ce sera donc le 5e sous-process qui vous intéresse.
On commence comme d'hab:
gdb ./unit-test-bus
On met les options suggérées :
set follow-fork-mode child
set detach-on-fork off
On met le breakpoint là où ça nous intéresse :
break component_create
Et on lance le tout :
run
gdb nous arrête au premier break. On regarde où on est :
info infe
On est dans le 2e process = le 1er test (car le 1 c'est le main et les tests créent un enfant (child process) à chaque fois) ; ce ne nous intéresse pas donc on continue :
cont
gdb nous dit que le 2e process (Inferior 2) est fini, mais lui il y est encore (faite info infe pour voir). Il faut donc le ramener au process père :
infe 1
et on continue :
cont
Il nous arrête à nouveau au breakpoint. On regarde à nouveau où on est :
info infe
Et on continue comme ça jusqu'au breakpoint qui nous intéresse.
Là on peut faire des next etc. comme d'habitude.

On peut comme ça se balader de process en process (infe <numero>) et savoir où on est (info infe).
Avec un peu d'habitude on s'y retrouve ;-)
Happy debugging!
In reply to Jean-Cédric Chappelier

debug through unit tests

by David Leonardo Lazar -

Bonsoir monsieur,

Auriez vous svp un tutoriel ou de la documentation plus spécifique à ce sujet?

Tous nos tests de jump/call ayant une condition (cc) ne passent pas et on n'arrive pas à débuguer : quand j'essaie cont j'obtiens segmentation fault et je n'arrive jamais aux breakpoints (dans mon propre code) pour trouver la source du problème.

Merci beaucoup pour votre aide,

Leo

In reply to David Leonardo Lazar

Re: debug through unit tests

by Jean-Cédric Chappelier -

si vous avez un SEGV, tapez la commande (gdb) « where » pour savoir où il se produit (cela affiche la pile d'appel).
Par ailleurs, pour un SEGV, peut être que valgrind ou ASAN sont plus appropriés (cf https://progos.epfl.ch/projet/handouts/dbg-ptr.pdf)