如何记录所有运行的命令由system()系统调用

时间:2010-08-18 12:15:57

标签: c++ unix system solaris

我正在尝试调试一个C ++应用程序,该应用程序通过system()系统调用调用许多命令行应用程序,如grep等。我需要通过system()调用来查看应用程序正在执行的所有命令。

我尝试通过启用历史记录查看这些命令并查看.history文件。但是这些命令不是通过终端执行的。历史文件只有交互执行的命令。

知道如何做到这一点?

3 个答案:

答案 0 :(得分:5)

定义一个名称相似的新宏:

#define system(_x) std::cout << _x << std::endl; (system)(_x);

system宏取代了system功能,并且:

  1. 它将命令打印到标准输出(或其他地方)。
  2. 它调用system函数。

  3. 感谢Hasturkun的建议,以下情况更好:

    #define system(_x) (std::cout << (_x) << std::endl, system(_x))
    

    也返回system函数调用的结果; - )

答案 1 :(得分:3)

跟踪“yourProgram”执行的每个命令:

truss -s!all -daDf -t exec yourProgram

例如:

$ 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

如果要将这些执行程序与system()调用关联起来,可以使用该命令:

truss -t execve -f -u 'libc:system' yourProgram

例如:

$ 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/1@1:  -> libc:system(0x8050a5c, 0x0)
20074/1:    execve("/bin/sh", 0x080471BC, 0x08047248)  argc = 3
a b c
20073/1@1:  <- libc:system() = 0
20073/1@1:  -> libc:system(0x8050a68, 0x0)
20076/1:    execve("/bin/sh", 0x080471BC, 0x08047248)  argc = 3
/tmp
20073/1@1:  <- libc:system() = 0

最后,如果您使用的是Solaris 10或更高版本,则可以使用Dtrace执行此任务,如下所示:

dtrace -Z -q -c yourProgram -n ' pid$target:libc:system:entry { printf("system(\"%s\")\n", copyinstr(arg0)); } '

将为该输出提供相同的“a”代码:

a b c
/tmp
system("echo a b c")
system("pwd")

PS:顺便说一句,system()不是系统调用,而是标准库函数。

答案 2 :(得分:2)

您可以使用truss或strace(不确定Solaris附带哪个)来运行程序并跟踪对系统的调用。

对于truss,相关命令将类似于truss -caf program_name