Jay*_*rod 38
正如Matthew所说,strace使用ptrace(2)系统调用来发挥其魔力.ptrace用于实现调试器和其他需要检查其他程序正在执行的工具.从本质上讲,strace将调用ptrace并附加到目标进程.
只要目标进程进行系统调用,它就会停止,并且会通知strace.然后strace将检查目标进程的寄存器和堆栈(也使用ptrace)来确定正在进行的系统调用(每个调用具有唯一的编号,在寄存器中传递)以及参数是什么.strace然后恢复过程.当它从系统调用返回时,它会停止,并再次通知strace,因此它可以检查返回值.strace每次发生这种情况时都会为用户打印一些信息.
在回答第二个问题时,系统调用与普通函数调用的不同之处在于,在内核中实现了系统调用,而在用户空间中实现了常规函数.这是一个完全独立的蠕虫病毒.
Joe*_*ato 10
我写了一篇关于strace 如何工作的博客文章,以及关于系统调用如何工作的更长篇博文.
strace通过使用ptrace系统调用来工作,这导致内核在每次通过系统调用进入或退出内核时停止被跟踪的程序.然后,跟踪程序(在这种情况下strace)可以使用检查程序的状态ptrace.
strace获取每个系统调用的参数,具体取决于系统的工作方式.在x86-64系统上,系统调用的参数在CPU寄存器中传递.在这种情况下,strace可以ptrace使用PTRACE_GETREGS参数调用以获取寄存器值的副本并打印它们.
系统调用是用户空间和内核空间之间的接口。有关列表,请参阅man 2 syscalls或syscalls.h 。
不应将它们与标准 C 库函数(例如printf. 这些通常最终会调用系统调用,但不一定。此外,用户空间程序可以直接使用系统调用函数来调用系统调用。