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 :

plein de questions dans un pavé.


Sujet :

C

  1. #1
    Membre éclairé
    Homme Profil pro
    ingénieur calcul
    Inscrit en
    Décembre 2007
    Messages
    363
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur calcul
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 363
    Par défaut plein de questions dans un pavé.
    Bonjour à tous, (et en particulier à matafan et souviron34 [bonjour presque voisin de Béziers] qui m'ont répondu plusieurs fois de façon qui m'a fait progresser)
    dans ce post d'hier (http://www.developpez.net/forums/d65...nel-virtuelle/) j'annonçais que la machine sun fire 68000 sous sunOS 5.8 sur laquelle je bosse et qui amène à mon entendement toutes les questions qui viennent n'allait bientôt plus être à ma disposition; or il est de l'ordre du possible que ce ne soit pas aussi immédiat que je le craignais. Donc disons que je voudrais changer la valeur du membre cr_uid de la structure cred attachée à la cmdtool (shell dans un fenêtre autonome) que j'ai créée par fork en tant que fille d'un programme en C. [qui s'appelle fcmdt comme Fork et CMDTool] (il est bien évident que si j'arrive un jour à modifier ce terme qui donne ses droits à ma shell, je ne ferai pas de bêtises puisque ce serait comme scier la branche sur laquelle je suis assis pour travailler gentiment)(mais cela m'impose d'apprendre plein de choses que d'essayer, alors que dix sept ans du même boulot ne me font plus tellement apprendre de nouveauté)

    Donc je lance mon petit programme, et il me dit un peu ce qui se passe; le fils, qui lance la cmdtool, intervient dans les deux avant-dernières lignes, avant que le père ne réponde à la commande ps, ce qui donne "l'adresse virtuelle kernel" de la structure "proc" attachée à la cmdtool-fille. Je ne sais toujours pas ce que c'est malgré une question chez Solaris http://www.developpez.net/forums/d65...nel-virtuelle/ , mais cette adresse est le début de la structure "proc" attachée à la cmdtool-fille, et un membre de cette structure est un pointeur vers la structure cred qui donne les droits à la cmdtool, et donc à la shell qu'elle met à l'écran :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     $ ./fcmdt
     
    pere:  getpid()=22860
    pere: pid_child=22865
    fils:  getpid()=22865
    fils: getppid()=22860
    pere: cmd=/usr/bin/ps -o user,pid,addr,args -p 22865 |grep moi |awk '{print $3}'
    30035a54a90
    Une fois que le programme m'a rendu la main, il y a un nouvelle shell créee par la cmdtool à l'écran, et je peux avoir son PID puis voir les résultats des commmandes pmap ou pstack la concernant, mais comment les interpréter ? Je devine que ça cause de choses qui se passent dans la mémoire, mais puis je en déduire mon adresse de la structure proc puis de la cred ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ ps -u moi | grep cmdt
     22865 pts/931  0:00 fcmdt
     22869 ??       0:00 cmdtool
    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
    $ pmap 22869
     
    28072:  /usr/openwin/bin/cmdtool
    00010000      8K read/exec         /usr/openwin/bin/cmdtool
    00020000     16K read/write/exec   /usr/openwin/bin/cmdtool
    00024000    256K read/write/exec     [ heap ]
    FEE80000    688K read/exec         /usr/lib/libc.so.1
    FEF3C000     32K read/write/exec   /usr/lib/libc.so.1
    FEF80000    568K read/exec         /usr/lib/libnsl.so.1
    FF01E000     40K read/write/exec   /usr/lib/libnsl.so.1
    FF028000     24K read/write/exec   /usr/lib/libnsl.so.1
    FF060000     16K read/exec         /usr/lib/libmp.so.2
    FF074000      8K read/write/exec   /usr/lib/libmp.so.2
    FF080000    552K read/exec         /usr/openwin/lib/libX11.so.4
    FF11A000     24K read/write/exec   /usr/openwin/lib/libX11.so.4
    FF130000      8K read/write/exec     [ anon ]
    FF140000     96K read/exec         /usr/openwin/lib/libXext.so.0
    FF168000      8K read/write/exec   /usr/openwin/lib/libXext.so.0
    FF170000      8K read/exec         /usr/platform/sun4u-us3/lib/libc_psr.so.1
    FF180000     40K read/exec         /usr/lib/libsocket.so.1
    FF19A000      8K read/write/exec   /usr/lib/libsocket.so.1
    FF1A0000      8K read/write/exec     [ anon ]
    FF1B0000      8K read/write/exec   /usr/lib/libdl.so.1
    FF1C0000      8K read/exec         /usr/lib/libintl.so.1
    FF1D0000     56K read/exec         /usr/openwin/lib/libolgx.so.3
    FF1EC000      8K read/write/exec   /usr/openwin/lib/libolgx.so.3
    FF200000   1424K read/exec         /usr/openwin/lib/libxview.so.3
    FF372000     56K read/write/exec   /usr/openwin/lib/libxview.so.3
    FF380000      8K read/write/exec   /usr/openwin/lib/libxview.so.3
    FF390000      8K read/exec         /usr/lib/libw.so.1
    FF3A0000    176K read/exec         /usr/lib/ld.so.1
    FF3DC000      8K read/write/exec   /usr/lib/ld.so.1
    FF3DE000      8K read/write/exec   /usr/lib/ld.so.1
    FFBCE000    136K read/write          [ stack ]
     total     4312K
    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
    //     -l    (pmap only) Print unresolved dynamic linker map names.
    $ pmap -l 22869
    22869:  ./fcmdt
    00010000      8K read/exec         fcmdt
    00020000      8K read/write/exec   fcmdt
    FF280000    688K read/exec         /usr/lib/libc.so.1
    FF33C000     32K read/write/exec   /usr/lib/libc.so.1
    FF370000      8K read/write/exec     [ anon ]
    FF380000      8K read/write/exec   /usr/lib/libdl.so.1
    FF390000      8K read/exec         /usr/platform/SUNW,Sun-Fire/lib/libc_psr.so.1
    FF3A0000    176K read/exec         /usr/lib/ld.so.1
    FF3DC000      8K read/write/exec   /usr/lib/ld.so.1
    FF3DE000      8K read/write/exec   /usr/lib/ld.so.1
    FFBEC000     16K read/write          [ stack ]
     total      968K
    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
     //     -r    (pmap only) Print the process's reserved addresses.
    $ pmap -r 22869
    22869:  ./fcmdt
    00010000      8K read/exec         /home/st13277/S/C/TMP/fcmdt
    00020000      8K read/write/exec   /home/st13277/S/C/TMP/fcmdt
    FF280000    688K read/exec         /usr/lib/libc.so.1
    FF33C000     32K read/write/exec   /usr/lib/libc.so.1
    FF370000      8K read/write/exec     [ anon ]
    FF380000      8K read/write/exec   /usr/lib/libdl.so.1
    FF390000      8K read/exec         /usr/platform/sun4u-us3/lib/libc_psr.so.1
    FF3A0000    176K read/exec         /usr/lib/ld.so.1
    FF3DC000      8K read/write/exec   /usr/lib/ld.so.1
    FF3DE000      8K read/write/exec   /usr/lib/ld.so.1
    FF3F0000   8192K read/write          [ stack ]
     total     9144K
    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
     //     -x    (pmap  only)  Print  resident/shared/private mapping details.
    $ pmap -x 22869
    22869:  ./fcmdt
     Address   Kbytes Resident Shared Private Permissions       Mapped File
    00010000       8       8       8       - read/exec         fcmdt
    00020000       8       8       -       8 read/write/exec   fcmdt
    FF280000     688     688     688       - read/exec         libc.so.1
    FF33C000      32      32       -      32 read/write/exec   libc.so.1
    FF370000       8       8       -       8 read/write/exec     [ anon ]
    FF380000       8       8       -       8 read/write/exec   libdl.so.1
    FF390000       8       8       8       - read/exec         libc_psr.so.1
    FF3A0000     176     176     176       - read/exec         ld.so.1
    FF3DC000       8       8       -       8 read/write/exec   ld.so.1
    FF3DE000       8       8       -       8 read/write/exec   ld.so.1
    FFBEC000      16      16       -      16 read/write          [ stack ]
    --------  ------  ------  ------  ------
    total Kb     968     968     880      88
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     $ pstack 22869
    22869:  ./fcmdt
     ff31fa30 waitid   (0, 6da6, ffbee720, 103)
     ff2d6c74 _waitpid (0, ffbee80c, 100, ffbee80c, 21e7c, ff314f38) + 60
     ff314f4c system   (20b48, ff340284, ff343a54, 0, 220f8, 1078c) + 25c
     00010800 main     (1, ffbeeb5c, ffbeeb64, 20800, 0, 0) + 80
     00010758 _start   (0, 0, 0, 0, 0, 0) + 108
    Excusez moi que ce post soit particulièrement illisible, mais j'ai passé une bonne partie de la journée dans les manpages à essayer de trouver comment interpreter les commandes "pchose PID", hébin à part pcred qui est évident, j'aimerais savoir ce que représentent les sorties de pmap et pstack.
    David qui a besoin d'aide; j'hésite à ajouter mon code qui n'est pas long, mais si quelqu'un a lu jusqu'ici, il peut bien poursuivre un peu et voir la grande lumière blanche que lui feront apparaître les lignes suivantes :
    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
     //
    // cc fcmdt.c -go fcmdt
    // ./fcmdt 
    //
    #include <stdio.h>
    #include <sys/types.h>
    #include <unistd.h>
    main(int argc, char* argv[]) { 
    char cmd[256];
    int child;
    child=fork();
    printf("\n");
    if(child==0) { // ici le fils
        printf("fils:  getpid()=%d\n", getpid());
        printf("fils: getppid()=%d\n", getppid());
        system("/usr/openwin/bin/cmdtool 2> /dev/null"); }
    else if(child==-1) { // ici err. ds le fork
        perror("fork"); }
    else { // ici le père
        printf("pere:  getpid()=%d\n", getpid());
        printf("pere: pid_child=%d\n", child);
        sprintf(cmd,"/usr/bin/ps -o user,pid,addr,args -p %d |grep st13277 |awk '{print $3}'\n", child);
        printf("pere: cmd=%s", cmd);
        system(cmd); } }
    //
    // cc fcmdt.c -go fcmdt
    // ./fcmdt

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    J'ai pas mal travaillé sur les équivalent des commandes pmap et pstack sous AIX (procmap et procstack).

    pmap t'affiche tout ce que le loader a chargé pour ton exécutable, et les adresses où il a chargé les différents morceaux. Par exemple tu vois que le segment text de ton programme fcmdt est chargé à l'adresse 0x00010000, son segment de données à l'adresse 0x00020000, le segment text de la libc est loadé à l'adresse 0xFF280000, et ainsi de suite.

    pstack t'affiche la stack de ton programme à un instant donné. La première colonne est l'adresse de l'instruction qui a fait le branch (ou l'instruction suivante, je ne connais pas les détails sous Solaris). Ensuite tu as le nom de la fonction, suivie de ses arguments. Enfin tu as l'offset du branch par rapport au début de fonction. Dans ton exemple, au moment où tu as fait le pstack ton process était dans waitid.

Discussions similaires

  1. Ne posez pas vos questions dans ce forum, ce n'est pas le lieu
    Par Jérôme Lambert dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/06/2006, 16h13
  2. cet ma première question dans ce forum ??
    Par zakiabdess dans le forum Access
    Réponses: 1
    Dernier message: 24/06/2006, 20h38
  3. Réponses: 2
    Dernier message: 12/05/2006, 14h20
  4. question dans les JFrame
    Par dimahoo dans le forum Agents de placement/Fenêtres
    Réponses: 2
    Dernier message: 23/03/2006, 23h30

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