CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

appeler sqrt dans gdb

godrik
godrik
Niveau 30
09 février 2010 à 22:54:46

Bonjour a vous,

J'ai actuellement un comportement bizarre avec gdb.
Je ne peux pas appeler la fonction sqrt dans gdb bien qu'elle fonctionne correctement dans le code. Lorsque je fais "p sqrt(4)", la reponse est toujours 0. alors que appeler strlen fonctionne correctement. Si j'essaye avec d'autre fonction de math.h, ca ne marche pas non plus. Si je fixe un pointeur de focntion a l'addresse de sqrt et que je fais l'appel par le pointeur de fonction ca marche correctement.

un avis eclaire sur la question ?

exemple: http://pastebin.com/m19170b77
Pour info, j'utilise debian lenny.

Kaoron
Kaoron
Niveau 9
09 février 2010 à 23:47:17

Ça semble avoir un rapport avec ton problème :
http://stackoverflow.com/questions/1354731/gdb-evaluation-of-a-function

dnob700
dnob700
Niveau 10
10 février 2010 à 00:39:29

À partle fait que l'argument attendu est un double (ça change quelque chose '4.' ?) le fait est qu'il y a au moins deux différence avec strlen : d'abord la fonction est dans une bibliothèque externe, peut-être que les symbole de débogage ne sont pas automatiquement inclue lorsque tu compile avec -lm -g (je ne sais pas trop comment ça fonctionne) et en plus, effectivement avec gcc, sqrt et d'autre fonction mathématique sont des builtin (mais je dirais que strlen aussi) qui sont compilé un peu comme des fonctions inline. Cela dit ce comportement est probablement inactif sans les optimisations. Essaye toujours de compiler avec -fno-builtin on ne sait jamais.

En tout cas, si tu trouve ce qui se passe tiens nous au courant.

godrik
godrik
Niveau 30
10 février 2010 à 01:37:05

Ca pourrait bien etre le meme probleme qu'ils ont. J'ai essaye "p sqrt(4.)" et "call sqrt(4.)" sans obtenir de difference. J'essayerai "-f no-builtin demain". J'ai l'impression que c'est lie au fonction qui sont dans la lib math (-lm)

Kaoron
Kaoron
Niveau 9
10 février 2010 à 01:46:03

http://sourceware.org/ml/gdb/2006-12/msg00172.html

«On Mon, 2006-12-18 at 21:55 -0800, Nikolay Molchanov wrote:

But if I ask "gdb" to evaluate sin(3.14) I get "1"
(which is not correct), and if I ask to evaluate
sin(4.1) or sin(5.1) I get "3" (?!).

I guess your system libraries aren't built with debuginfo. This means
that GDB won't know the sin function's prototype and it will interpret
the result as an int. There might also be other issues with passing
doubles to un-prototyped functions, but the previous point is sufficient
to explain your issue.»

«By default (without debuginfo as Frederic says) it assumes sin takes an
integer argument and returns an value (I think).

You need to cast sin explicitly:

(gdb)
-data-evaluate-expression "((double ((*) (double))) sin) (5.1)"
^done,value="-0.92581468232773245"
(gdb)
-data-evaluate-expression "((double ((*) (double))) sin) (4.1)"
^done,value="-0.81827711106441026"»

godrik
godrik
Niveau 30
11 février 2010 à 18:29:36

On dirait que c'est ca, je viens de tester le cast explicite de sqrt et cela fonctionne:

(gdb) p ((double ((*) (double))) sqrt) (4.)
$4 = 2
(gdb) p ((double ((*) (double))) sqrt) (4.6)
$5 = 2.1447610589527217

J'ai essayer avec une lib de debuggage J'ai installer une libc avec debugage et j'ai maintenant:
erik@powell:/tmp$ ldd test
linux-vdso.so.1 => (0x00007fff153ff000)
libm.so.6 => /usr/lib/debug/libm.so.6 (0x00007ffa0cef3000)
libc.so.6 => /usr/lib/debug/libc.so.6 (0x00007ffa0cba0000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffa0d176000)
qui confirme que la libc et libm avec symbol de debug est utilise.
mais dans gdb le probleme persiste et "p sqrt" indique $1 = {<text variable, no debug info>} 0x7fe49ef5fd50 <__sqrt>
qui semble dire qu'il n'y a pas de symbole de debuggage la dedans...

dnob700
dnob700
Niveau 10
11 février 2010 à 18:45:02

as tu essayé avec -fno-builtin ? sinon, il es possible que comme il n'y a pas vraiment d'appel à sqrt dans ton code, gcc supprime les info de débogage qui lui semble inutile.

godrik
godrik
Niveau 30
11 février 2010 à 18:54:28

-fno-builtin ne change rien. Faire un appel explicite a sqrt dans le code (sur une variable lue depuis l'entree standard pour que gcc ne remplace pas la valeure de retour par un precalcul) ne change rien non plus. Passer en -O0 ne change rien egalement.

dnob700
dnob700
Niveau 10
11 février 2010 à 19:54:50

ah oui, j'ai confondu cette optimisation avec une autre (qui était effectuée par VC++) qui consiste à remplacer les appels à ce genre de fonction par des espèces de macro en assembleur (même sur des arguments inconnus). Ça correspond peut-être à -ffast-math, mais qui est désactivé de toutes manières.

Est-ce que tu peux indiquer comment est-ce que tu compiles ton programme ? parce que chez moi, même avec libc6-dbg installé (mais ce n'est peut-être pas le bon paquet) et en compilant avec -g, ldd m'indique les versions normales des bibliothèques.

godrik
godrik
Niveau 30
11 février 2010 à 20:25:56

il faut changer LD_LIBRARY_PATH pour utiliser les lib de /usr/lib/debug

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment