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

Bibliothèques Discussion :

Ptrace Comment ça marche?


Sujet :

Bibliothèques

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut Ptrace Comment ça marche?
    Bonjour,

    Dans le man il est dit que ptrace permet d'éditer l'image mémoire du processus tracé.

    Mon probleme est que je n'arrive pas à récupérer cette image mémoire. Je récupere la valeur renvoyer par ptrace, la valeur de errno mais ou puis-je trouver les autres informations sur le processus tracé.??

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    PTRACE_PEEKUSR, PTRACE_PEEKTEXT, etc.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #include <sys/errno.h>
    #include <sys/types.h>
    #include <iostream>
    #include <sys/ptrace.h>
    #include <unistd.h>
    #include <linux/user.h>
    #include </usr/include/signal.h>
    #include <csignal>
    using namespace std;
     
    int main ()
    {
        pid_t Child = fork ();
        long Ptr;
        const void * Addr = "Ox13";//j'ai mis la valeur au hazar
        if (Child == 0)
        {
            Ptr =  ptrace (PTRACE_TRACEME,0,NULL,NULL);
            signal (SIGSTOP,SIG_IGN);
            wait();
            cout << "ptrace : " << Ptr << '\n';
            execl("/bin/ls", "ls", NULL);
        }
        else
        {
            wait();
            Ptr =  ptrace (PTRACE_PEEKTEXT,Child, & Addr ,NULL);
            cout << "ptrace : " << Ptr << " - Addr : "<< Addr
                 << " - errno : " << errno<< " - what() : "
                 << strerror(errno) << '\n';
            ptrace(PTRACE_CONT, Child, NULL, NULL);
        }
        return 0;
    }
    bon j'ai voulu testé en ecrivant ça. quesque je fait et qui n'est pas bon??

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    const void * Addr = "Ox13";//j'ai mis la valeur au hazar
    C'est quoi ce truc horrible ?

    Et en quoi ton programme marche pas ?
    (A priori c'est plutôt Addr que &Addr...)

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    le troisieme argument de ptrace pointe sur une adresse memoire donc je lui ai mis une adresse en parametre avec une valeur au hazar ne sachant pas ce que je devait metre.

    comme resultat il me donne :

    ptrace : -1 - Addr : 0x8048b1c - errno : 3 - what() : No such process
    ptrace : 0

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Y'a même pas de wait sans paramètre d'après le man.
    Et t'as pas testé si le fork s'est bien passé.

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    bon d'accord je vais deja corriger ça. merci

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 84
    Par défaut
    super ca marche. j'ai verifier que fork() marcher et j'ai mis une valeur dans le wait().
    le nouveau code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    int main ()
    {
        pid_t Child = fork ();
        if (Child == -1)
        {
            cout << "fork () a echoue ...";
            return -1;
        }
        cout << "pid pere : " << getpid() << " PidFils : " << Child << '\n';
        long Ptr;
        int Status;
        const void * Addr = "Ox13";
        if (Child == 0)
        {
            Ptr =  ptrace (PTRACE_TRACEME,0,NULL,NULL);
            signal (SIGSTOP,SIG_IGN);
     
            cout << "ptrace : " << Ptr << '\n';
            execl("/bin/ls", "ls", NULL);
        }
        else
     {
            pid_t Attente = wait(& Status);
            cout << "Valeur de fin = " << Attente << '\n';
     
            Ptr =  ptrace (PTRACE_PEEKTEXT,Child, Addr ,NULL);
     
            cout << "ptrace : " << Ptr << " - Addr : "<< Addr
                 << " - errno : " << errno<< " - what() : "
                 << strerror(errno) << '\n';
     
            ptrace(PTRACE_CONT, Child, NULL, NULL);
        }
        return 0;
    }
    resultat apres modification :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    pid pere : 30379 PidFils : 0
    ptrace : 0
    pid pere : 30378 PidFils : 30379
    Valeur de fin = 30379
    ptrace : 1768316774 - Addr : 0x8048c79 - errno : 0 - what() : Success
    deux questions :
    1- que dois-je mettre à la place du truc horrible ?? const void * Addr = "Ox13";

    2- Dans le man il est écrit que Linux ne sépare pas les espaces d'adressage de code et de données. donc que dois-je comprendre en lisant :

    ptrace : 1768316774

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

Discussions similaires

  1. ToAsciiEx, comment cela marche ?
    Par mikyfpc dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/02/2004, 21h39
  2. [MFC] list box : comment ça marche
    Par runn2 dans le forum MFC
    Réponses: 4
    Dernier message: 28/01/2004, 12h36
  3. [SYNEDIT] -> Comment ça marche ?
    Par MaTHieU_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 19h11
  4. [TP][Turbo Vision] comment ça marche ??
    Par Costello dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 05/08/2003, 00h24
  5. [update][req. imbriquee] Comment ca marche ??
    Par terziann dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/07/2003, 12h51

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