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.