Impossible d’appeler la fonction mathématique standard dans le débogueur?

J’ai essayé d’appeler ma propre fonction et fonction standard dans le débogueur:

#include #include #include int i=3; void f(){ ++i; printf("%d\n",i); } int main(){ ++i; int j=i+2; double d=cos(0.0); printf("%f\n",d); return 0; } 

Comstackz ce programme et exécutez, il imprimera “1.000000” comme je l’espérais. En gdb, j’ai essayé:

 (gdb) b main Breakpoint 1 at 0x40055b: file xc, line 10. (gdb) r Starting program: /home/x/a.out Breakpoint 1, main () at xc:10 10 ++i; (gdb) call f() 4 (gdb) call f() 5 (gdb) call cos(0.0) No symbol "cos" in current context. # WHY????? (gdb) call printf("%d\n",i) 5 $1 = 2 (gdb) call putchar('a') $2 = 97 

Pourquoi GDB ne peut même pas trouver le symbole? Je suppose que l’option “-g” apportera des informations de débogage à la fois pour mon programme et pour la bibliothèque standard, n’est-ce pas? Ou dois-je installer un paquet supplémentaire pour le débogage / le code source de la bibliothèque standard? Je suis sur Ubuntu16.04

Merci beaucoup.

Malgré les apparences immédiates, cette partie de gdb fonctionne bien. Donc mon premier instinct est que nous sums dans une sorte de situation GIGO – gdb est exceptionnellement sensible à l’action ennemie des compilateurs et des kernelx – et une enquête est nécessaire.

Vous ne dites pas si vous utilisez C ou C ++.

En C ++, je peux voir qu’il n’y a pas de debuginfo émise pour cos et que l’appel est complètement optimisé. Vous pouvez vérifier cela en lançant nm et en notant que cos n’apparaît pas comme un symbole non défini; ou simplement en remarquant que ce programme se lie très bien sans -lm .

Ma théorie pour C ++ est que cela se produit car il ya une version constexpr de cos in scope (je le vois dans la sortie prétraitée mais je n’ai pas essayé de vraiment vérifier), donc g ++ optimise l’appel entier.

Pour C, je vois la même chose par défaut. Cependant, je peux obtenir un appel à cos en transmettant -fno-builtin-cos à gcc. Mais, haha, ce n’est toujours pas dans le debuginfo!

Cela me semble être un bug de gcc. Normalement, vous n’avez pas besoin de debuginfo pour une bibliothèque simplement pour avoir access à un type ou une fonction de la bibliothèque utilisée par votre programme.

Vous pouvez également remarquer que quelque chose de bizarre se passe en essayant d’imprimer la fonction elle-même:

 (gdb) p cos $1 = {} 0x7ffff7aebc50  

C’est une double mauvaise nouvelle, car les fonctions “GNU indirectes” sont des créatures magiques mal comsockets par gdb. En particulier, je ne pense pas qu’ils puissent être appelés à partir du débogueur, même si debuginfo est installé.

En fait, la seule chose que je pouvais faire était de prendre l’adresse de cos dans le programme, puis d’appeler via ce pointeur, comme:

 mumble *my_cos = &cos; ... (gdb) print my_cos(0.0) 

Eh bien, ce n’est pas complètement vrai. Je pourrais aussi faire ce travail:

 (gdb) info func cos@plt All functions matching regular expression "cos@plt": Non-debugging symbols: 0x0000000000400500 cos@plt (gdb) p ((double(*)(double))0x0000000000400500)(0.0) $6 = 1 

Cela évite les trucs indirects GNU. Cependant, c’est assez désagréable.

  • La fonction cos est implémentée dans libm, pas dans libc. Avez-vous même lié avec -lm?
  • Le compilateur optimise les expressions constantes. Il n’y a aucune raison de calculer cos (0) à l’exécution. Il n’est donc pas nécessaire d’inclure la fonction cos et aucune raison pour que la bibliothèque mathématique soit liée. La référence à libm est supprimée de votre exécutable (que vous pouvez vérifier avec readelf ou un outil similaire), donc gdb ne sait rien sur cos (ou toute autre fonction de la bibliothèque mathématique).
  • Comme Tom Tromey l’a expliqué, une solution possible consiste à désactiver les fonctions intégrées de gcc. Après cela, je peux appeler cos depuis gdb (comme ceci: print cos (1.0)).