如何跟踪输入命令后调用的系统调用?

如何跟踪输入命令后调用的系统调用?

这个问题与“当我们在 shell 上输入一个简单的命令时会发生什么?”的问题我之前发过帖子。 (我认为单独发布会更好。但如果没有,请告诉我。)

我从中学到了上一个问题shell 内置命令经过特殊处理,普通外部命令在子进程上执行。

这次,我想跟踪 fork、clone 或 execve 等系统调用,以监视输入命令后实际发生的情况。但当我这样execve("bin/ls",,,) = 0执行时,我只能跟踪 execve 调用。strace

strace -etrace=execve,clone ls

正如我猜测的那样,这意味着我只能监视创建子进程后调用的系统调用。

要监视与创建新进程相关的所有系统调用,我必须做什么?在这种情况下,用bash -clike调用命令strace -etrace=execve,clone bash -c '{ ls; }' 会有帮助吗?

答案1

正如其中一篇中提到的答案对于您之前的问题,exec家庭调用是在创建子进程之后发生的,因此如果您希望它出现在输出中,strace那么您必须使其也跟随您正在跟踪的 shell 进程的子进程。

您可以通过添加-f-ff选项来完成此操作,以下是相关的手册页片段:

 -f  Trace child processes as they are created by currently traced processes as a
     result of the fork(2) system call.
-ff  If the -o filename option is in effect, each processes trace is written to
     filename.pid where pid is the numeric process id of each process.  This is
     incompatible with -c, since no per-process counts are kept.

要跟踪运行命令所涉及的相关调用,bash您可以执行以下操作:

strace -f -e trace=process bash -c 'ls; :'

-e trace=process专门跟踪进程管理中涉及的所有调用。另外,还需要第二个无操作命令(:),就像您仅使用单个命令运行 bash 一样,它足够聪明,可以只执行execve而不分叉,因为它知道不需要执行任何其他操作。

相关内容