IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Lecture de réels avec ptrace.


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Lecture de réels avec ptrace.
    Bonjour à tous,
    Je viens à vous car je rencontre un petit problème à laquelle je ne trouve ni explication, ni solution:
    Je possède deux scripts dont l'un crée juste une variable en mémoire et me renvoie son adresse ainsi que son PID.

    Terminal A:
    Address : 0x7ffd77bbb4bc
    Valeur : 52
    My process ID : 9199
    Le second script à pour but de récupérer cette valeur en se liant au processus via la fonction ptrace (sys/ptrace.h).
    Tout fonctionne merveilleusement bien lorsqu'il s'agit de récupérer un entier.

    Terminal B:
    Processus attaché !
    Valeur : 52
    Cependant lorsque je change mes types entiers en réels (float par exemple) dans les deux fonctions, la magie cesse d'opérer et je ne comprend pas pourquoi;

    Terminal A:
    Address : 0x7ffe68f4e38c
    Valeur : 5.20
    My process ID : 9308
    Terminal B:
    Processus attaché !
    Valeur : 7562919813157224448.000000
    Je récupère mon nombre avec le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    float a =ptrace(PTRACE_PEEKDATA,child,addr,NULL);
    printf("Valeur : %f\n",a);
    Quelqu'un aurait-il l’amabilité m'expliquer d’où vient ce problème ? (Je précise que je suis pas un pro au cas ou).
    Merci de votre aide.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est parce que ptrace retourne une suite de bits, et que tu procèdes à la conversion numérique de l'entier que représente ces bits en un float.

    Il faut que tu interprète ces bits comme un float directement, puisque c'est ce qu'ils sont.
    L'opération passe par un jeu de pointeur.
    il faut obtenir le float désigné par le pointeur de float désignant l'adresse du nombre retourné.

    à priori "le type de retour de ptrace" retourne = ptrace(...); float valeur = * (float*)(&retourne) devrait suffire.
    Au besoin, il faut passer par une variable intermédiaire.


    Note: je connais bien la procédure en C++, un reinterpret_cast<float>( ptrace(...) ). En C, il y a des détails que j'ai raté.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Lis bien les warnings du compilateur afin d'éviter ce genre d'erreur.


    Pour compléter la réponse de ternel, attention aux conversions ! Un petit tour sur la page de manuel donne (emphase mienne) :

    Read a word at the address addr in the tracee's memory,
    ..puis, un peu plus loin :

    The size of a "word" is determined by the operating-system variant (e.g., for 32-bit Linux it is 32 bits).
    Il conviendrait de rendre la conversion plus explicite, en éliminant les bits non significatifs.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 2
    Points : 3
    Points
    3
    Par défaut ça marche
    Merci ternel et Matt_Houston pour vos réponses !

    La solution fonctionne et vos explications sont très claires.

    Le code final fonctionne au cas ou ça aiderait d'autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    long a =ptrace(PTRACE_PEEKDATA,child,addr,NULL);
    float valeur = * (float*)(&a);
    printf("Valeur : %f\n",valeur);
    Encore merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. compatibilité des réels avec pascal (pour fichier de record)
    Par jacquesberger dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2005, 19h58
  2. Lecture de mail avec TIdPop3
    Par skywaukers dans le forum Web & réseau
    Réponses: 1
    Dernier message: 06/07/2005, 10h52
  3. Quel niveau réel avec uv du Cnam en cour ?
    Par nebule dans le forum Etudes
    Réponses: 6
    Dernier message: 10/04/2005, 17h11
  4. [LG]Lecture de fichier avec une adresse internet
    Par forbin dans le forum Langage
    Réponses: 8
    Dernier message: 09/02/2005, 19h00
  5. Réponses: 4
    Dernier message: 23/07/2003, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo