【问题标题】:Why am I not able to view the clone() system call in strace output when typing 'strace ls' in terminal?为什么在终端中键入“strace ls”时无法在 strace 输出中查看 clone() 系统调用?
【发布时间】:2020-10-14 19:29:51
【问题描述】:

我的理解是,当我们在终端输入ls时:

  1. 它调用fork()库函数调用系统调用clone() 创建一个子进程。
  2. 然后调用系统调用execve()将新创建的进程的地址空间替换为新的内容。

在这种情况下,我希望在strace ls 输出中看到系统调用clone()execve()。但我只看到execve() 而不是clone()

可能是什么原因?

我尝试了以下命令:

strace ls
strace -c ls
strace -f ls 

操作系统 - 红帽

【问题讨论】:

  • 尝试strace strace ls 以获得启发。 strace 仅在进程被分叉后才开始跟踪进程。这确实是它可以工作的唯一方法,你无法追踪一个不存在的进程。

标签: linux linux-kernel system-calls ls strace


【解决方案1】:

是的,你的shell确实fork+execve来执行命令,但是你没有跟踪你的shell,所以你看不到它!

strace 工具简单地创建一个孩子(通过fork),用ptrace 附加到它,然后执行请求命令的execve,所以如果你做一个简单的strace ls,第一件事就是您将看到由strace 完成的execve 开始ls

如果您想查看 您的 shell 做了什么,您可以启动一个 shell,然后使用 strace 从另一个 shell 附加到它。

  1. 启动一个 shell,然后获取它的 PID(在 bash 中,echo $$ 将为您获取当前的 shell PID)。
  2. 启动第二个 shell,然后运行 ​​strace -f -p PID_OF_FIRST_SHELL
  3. 在第一个 shell 中执行 ls,在第二个 shell 中执行 strace 的输出。

请注意,由于strace 默认跟踪每个系统调用,并且 shell 通常是非常复杂的程序,因此您会在输出中看到很多系统调用。如果您只想观察一些系统调用,可以使用-e 选项过滤它们,例如:

strace -e clone,fork,execve -f -p PID_OF_FIRST_SHELL

我的机器上的示例:

  • 外壳 1:

    root@desktop:~/test# echo $$
    30878
    root@desktop:~/test# ls -l
    total 0
    -rw-r--r-- 1 root root 0 Oct 15 00:21 a
    -rw-r--r-- 1 root root 0 Oct 15 00:21 b
    -rw-r--r-- 1 root root 0 Oct 15 00:21 c
    -rw-r--r-- 1 root root 0 Oct 15 00:21 d
    
  • 外壳 2:

    root@desktop:~/test# strace -e clone,fork,execve -f -p 30878
    strace: Process 30878 attached
    clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f070ece0a10) = 30958
    strace: Process 30958 attached
    [pid 30958] execve("/bin/ls", ["ls", "--color=auto", "-l"], 0x55c87a5cb9f0 /* 22 vars */) = 0
    [pid 30958] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=30958, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
    clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f070ece0a10) = 30959
    strace: Process 30959 attached
    [pid 30959] +++ exited with 0 +++
    --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=30959, si_uid=0, si_status=0, si_utime=0, si_stime=0} ---
    ...
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多