Pour tracer chaque commande exécutée par "yourProgram":
truss -s!all -daDf -t exec yourProgram
par exemple:
$ truss -s!all -daDf -t exec sh -c "/bin/echo hello world;/bin/date"
Base time stamp: 1282164973.7245 [ Wed Aug 18 22:56:13 CEST 2010 ]
5664: 0.0000 0.0000 execve("/usr/bin/i86/ksh93", 0x080471DC, 0x080471EC) argc = 3
5664: argv: sh -c /bin/echo hello world;/bin/date
5665: 0.0106 0.0106 execve("/bin/echo", 0x08067484, 0x080674F8) argc = 3
5665: argv: /bin/echo hello world
hello world
5664: 0.0126 0.0126 execve("/bin/date", 0x080674E0, 0x080674F8) argc = 1
5664: argv: /bin/date
Wed Aug 18 22:56:13 CEST 2010
Si vous souhaitez établir une corrélation entre ces execs au système() appelle, vous pouvez utiliser cette commande:
truss -t execve -f -u 'libc:system' yourProgram
par exemple:
$ cat a.c
main()
{
system("echo a b c");
system("pwd");
}
$ truss -t execve -f -u 'libc:system' ./a
20073: execve("a", 0x08047240, 0x08047248) argc = 1
20073/[email protected]: -> libc:system(0x8050a5c, 0x0)
20074/1: execve("/bin/sh", 0x080471BC, 0x08047248) argc = 3
a b c
20073/[email protected]: <- libc:system() = 0
20073/[email protected]: -> libc:system(0x8050a68, 0x0)
20076/1: execve("/bin/sh", 0x080471BC, 0x08047248) argc = 3
/tmp
20073/[email protected]: <- libc:system() = 0
Enfin, si vous êtes en utilisant Solaris 10 ou plus récent, vous pouvez utiliser Dtrace pour cette tâche comme ceci:
dtrace -Z -q -c yourProgram -n ' pid$target:libc:system:entry { printf("system(\"%s\")\n", copyinstr(arg0)); } '
qui donnera cette sortie avec le même « un » code:
a b c
/tmp
system("echo a b c")
system("pwd")
PS: Par le système de navigation() n'est pas un appel système, mais une fonction de bibliothèque standard.
@jlliagre Exactement ce que je cherchais! Noté sur le système() Merci :) – Raj