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

如何记录system()系统调用运行的所有命令 我尝试调试一个C++应用程序,它通过系统调用(系统调用)调用许多命令行应用程序,如GRIP等。我需要通过system()调用查看应用程序正在执行的所有命令,c++,unix,system,solaris,C++,Unix,System,Solaris,我试图通过启用历史记录和查看.history文件来查看这些命令。但这些命令不是通过终端执行的。历史文件中只有交互执行的命令 您知道如何做到这一点吗?您可以使用truss或strace(不确定Solaris附带的是哪一个)来运行程序并跟踪对系统的调用 对于truss,相关命令类似于truss-caf program\u name您可以使用truss或strace(不确定Solaris附带的是哪一个)来运行程序并跟踪对系统的调用 对于truss,相关命令类似于truss-caf program\u

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


您知道如何做到这一点吗?

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


对于truss,相关命令类似于
truss-caf program\u name

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


对于truss,相关命令类似于
truss-caf program\u name

定义具有类似名称的新宏:

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

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

定义具有类似名称的新宏:

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

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

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

例如:

如果要将这些exec与system()调用关联,可以使用以下命令:

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

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


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

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

例如:

如果要将这些exec与system()调用关联,可以使用以下命令:

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

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



顺便说一下,system()不是一个系统调用,而是一个标准的库函数。

您可能希望将其更改为类似于
#define system(_x)的内容(std::cout@Hasturkun:谢谢。我忘了可以在代码中请求
system
函数调用的结果。@Hasturkun:在
system
宏的定义中,
system
函数调用应该用括号括起来,以防止
system
宏递归调用自身。@PC2st:这不是必需的SARE- C++标准禁止预处理器扩展<代码>系统> /Calp>宏。一个相当侵入性的解决方案,不管它是否工作,Solaris都提供了更容易的方法来做同样的事情。你可能想把它变成像“代码>定义系统(x))。(std::cout@Hasturkun:谢谢。我忘了可以在代码中请求
system
函数调用的结果。@Hasturkun:在
system
宏的定义中,
system
函数调用应该用括号括起来,以防止
system
宏递归调用自身。@PC2st:这不是必需的SARE- C++标准禁止预处理器扩展<代码>系统> /C>宏递归。尽管操作系统不管是Solaris,还是一个相当侵入性的解决方案提供了更容易的方法。
调用本身,或者它会像Linux的strace一样显示组成系统调用(例如,
fork()
exec()
)?@pilcrow。您是对的,它将显示底层系统调用,您可以使用一些truss参数将其筛选为exec调用。我已经很久没有使用它了,但您可以很容易地获得所有exec的列表和传递给它的参数。而OP要求调用system()在不了解上下文的情况下,我不能完全确定他们是否需要一个特定的“fork/exec”实例是否包含。Solaris truss实际上也可以跟踪库函数调用,尽管它不会显示它们的参数。有关详细信息,请参阅我的其他答复。@jiiagre。谢谢你。大约从1993年起我就没有使用过truss,所以我对语法的记忆不是很好。truss会处理
system()吗
调用本身,或者它会像Linux的strace一样显示组成系统调用(例如,
fork()
exec()
)?@pilcrow。您是对的,它将显示底层系统调用,您可以使用一些truss参数将其筛选为exec调用。我已经很久没有使用它了,但您可以很容易地获得所有exec的列表和传递给它的参数。而OP要求调用system()在不了解上下文的情况下,我不能完全确定他们是否需要一个特定的“fork/exec”实例是否包含。Solaris truss实际上也可以跟踪库函数调用,尽管它不会显示它们的参数。有关详细信息,请参阅我的其他答复。@jiiagre。谢谢你。大约从1993年起我就没有使用过truss,所以我对语法的记忆不是很好。@jlliagre正是我要找的!在system()上注明谢谢:)@jlliagre正是我想要的!在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
dtrace -Z -q -c yourProgram -n ' pid$target:libc:system:entry { printf("system(\"%s\")\n", copyinstr(arg0)); } '
a b c
/tmp
system("echo a b c")
system("pwd")