• # pour ceux qui, comme saint thomas, ne croient que ce qu'ils voient

    Posté par . En réponse à la dépêche latrace, le traceur qui instrumente le chargeur dynamique. Évalué à 4.

    Compilation de latrace 0.5.9
    Attention, la compilation de latrace nécessite d'avoir flex, bison, et autoconf. Avoir le paquetage binutils-dev installé est optionnel.
    $ wget http://people.redhat.com/jolsa/latrace/dl/latrace-0.5.9.tar.(...)
    $ tar xfj latrace-0.5.9.tar.bz2
    $ cd latrace-0.5.9
    $ aclocal && autoconf && ./configure && make && sudo make install

    latrace est maintenant installé dans /usr/local.

    Compilation d'un exécutable dynamique multithreadé
    le fichier C suivant est tiré de l'échange de mail en lien sur la dépêche.
    $ cat > test.c << EOF
    #include <stdio.h>
    #include <pthread.h>
    #include <unistd.h>

    void *thread(void *i)
    {
    pthread_t t2,t3;
    printf("In thread\n");

    printf("thread PID %d\n", getpid());
    sleep(5);
    pthread_exit(0);
    }

    int main(int argc, char **argv)
    {
    pthread_t t1, t2;

    printf("main PID %d\n", getpid());
    pthread_create(&t1, NULL, thread, NULL);
    pthread_create(&t2, NULL, thread, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    printf("threads joined\n");

    return 0;
    }
    EOF
    $ gcc -o test test.c -lpthread
    $ ./test
    main PID 27180
    In thread
    thread PID 27180
    In thread
    thread PID 27180
    threads joined

    ltrace en action pour tracer les appels à sleep:
    $ ltrace -e sleep ./test
    main PID 27228
    In thread
    thread PID 27228
    +++ killed by SIGTRAP +++

    Après avoir lu le man de ltrace, l'option -f permet de suivre les processus fils forkés :
    $ ltrace -e sleep -f ./test
    main PID 27237

    ltrace reste bloqué, vous pouvez le tuer avec ctrl+c, ctrl+z puis kill -9 %1.
    À latrace de jouer maintenant :
    $ latrace -s sleep ./test
    main PID 27204
    In thread
    thread PID 27204
    In thread
    thread PID 27204
    27205 sleep [/lib/i686/cmov/libc.so.6]
    27206 sleep [/lib/i686/cmov/libc.so.6]
    threads joined

    ./test finished - exited, status=0