Doute concernant un code optimisé pour la queue sous ‘gdb’

Considérons une implémentation factorielle récursive en C:

#include  unsigned long long factorial(unsigned long long fact_so_far, unsigned long long count, unsigned long long max_count){ if (max_count==0 || max_count==1 || count >= max_count) return fact_so_far; else { printf("%llu %p \n", count, &factorial); return factorial(fact_so_far * count, ++count, max_count); } } int main(int argc, char **argv) { unsigned long long n; scanf("%llu", &n); printf("\n Factorial %llu \n",factorial(1,0,n)); return 0; } 

Je place un point d’arrêt dans ‘factorial’ et je lance ce qui précède sous ‘gdb‘. Le point d’arrêt n’est jamais touché.

En supposant que son appel de queue soit optimisé (je l’ai compilé avec gcc -O2), il devrait atteindre le point d’arrêt, au moins une fois, IIRC.

EDIT: Je reçois le résultat final sans bash un point d’arrêt. Pour, par exemple,

 (gdb) b factorial Breakpoint 1 at 0x8048429: file factorial-tail.c, line 3. (gdb) run Starting program: /home/amit/quest/codes/factorial-tail 5 0 0x8048420 1 0x8048420 2 0x8048420 3 0x8048420 4 0x8048420 Factorial 120 Program exited normally. (gdb) 

Où vais-je mal?

Il se pourrait que la fonction factorielle soit en ligne. Si cela se produit, une deuxième copie de factorielle sera utilisée pour les appels provenant d’autres fichiers .c; c’est là que se trouvait votre point d’arrêt. Essayez de passer -fno-inline.

Fonctionne bien pour moi. Vous vous connectez pour utiliser l’indicateur -g pour append des informations de débogage lors de la compilation? Et vous vous souvenez que vous devez entrer un nombre pour calculer la factorielle?