- On ouvre deux terminaux. Dans un terminal on lance
strace -f exo_06.run 'm.run' 2>&1 tee log.txt
et on commence à voir des choses du genre
[pid 19630] write(2, "My pid is ", 10My pid is ) = 10
[pid 19630] write(2, "19630", 519630) = 5
[pid 19630] write(2, "\n", 1
) = 1
[pid 19630] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 19630] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 19630] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 19630] nanosleep({1, 0}, 0x7ffff2801c20) = 0
[pid 19630] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 19630] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 19630] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 19630] nanosleep({2, 0}, 0x7ffff2801c20) = 0
- Alors on récupère ainsi le pid (19630) et "vite-vite" on va dans l'autre terminal et on fait
less /proc/19630/maps
et on voit plein de lignes de ce fichier-là avec les zones mémoires
dont le noyau a muni notre processus
00400000-00403000 r-xp 00000000 08:07 14344203 /home/....
7fc087321000-7fc087477000 r-xp 00000000 08:06 156058 /lib64/libc-2.11.2.so
...
7fffec018000-7fffec039000 rw-p 00000000 00:00 0 [stack]
...
Par contre, on ne voit pas de ligne avec le mot heap (pas encore).
-
Quittons
alors le less (avec la touche q) dans cet autre terminal (gardons le terminal
ouvert).
-
Revenons à l'autre terminal et continuons à regarder le déroulement :
...
[pid 19630] nanosleep({3, 0}, 0x7ffff2801c20) = 0
[pid 19630] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 19630] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 19630] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 19630] nanosleep({4, 0}, 0x7ffff2801c20) = 0
[pid 19630] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 19630] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 19630] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 19630] nanosleep({1, 0}, 0x7ffff2801c20) = 0
[pid 19630] brk(0) = 0x605000
[pid 19630] brk(0x626000) = 0x626000
[pid 19630] rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
[pid 19630] rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
[pid 19630] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 19630] nanosleep({1, 0}, 0x7ffff2801c20) = 0
- Nous venons de voir le brk(unGrandNombreEnHexa) en question.
- Regardons vite notre /proc/19630/maps
à nouveau (juste touche Flêche-en-haut et ensuite touche Entrée (si vous utilisez bash),
pour rappeler la dernière commande
dans l'autre terminal). Cette fois on voit bien une nouvelle ligne
00605000-00626000 rw-p 00000000 00:00 0 [heap]
qui est apparue suite à l'exécution du brk(0x626000). (Si on ne l'aperçoit pas tout
de suite "à l'oeil nu", on peut la chercher en tapant
/heap (le / annonce à less qu'on souhaite qu'il nous cherche une
chaîne de caractères dans le fichier en cours d'examination)).
- Quittons à nouveau
le less et revenons à l'autre terminal avec l'exécution.
- On y voit par la suite apparaître d'autres nanosleep(), etc., et enfin l'execve()
de notre m.run, suivi d'un nouveau brk(0), et après plein d'autres appels, on voit enfin un
nanosleep(30), qui est celui du programme m.c.
[pid 19630] execve("/home/.../m.run", ...) = 0
[pid 19630] brk(0) = 0x602000
[pid 19630] mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7eff6fc8a0
...
[pid 19630] rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
[pid 19630] nanosleep({30, 0}, 0x7ffff3e98f50) = 0
- Une dernière fois on va alors vite dans l'autre terminal et on regarde à nouveau
notre /proc/19630/maps, et là on voit un paysage bien différent. Les premières lignes
maintenant parlent de m.run (et non plus d'exo_06.run), et il n'y a plus de ligne avec
heap.
Vous pouvez remplacer les