Kernel dtrace:don';无法捕获任何写系统调用
我是dtrace新手,正在尝试编写一些基本的dtrace脚本。我找到了一个在单独的终端上捕获读(2)和写(2)系统调用的示例,如下所示Kernel dtrace:don';无法捕获任何写系统调用,kernel,system-calls,dtrace,Kernel,System Calls,Dtrace,我是dtrace新手,正在尝试编写一些基本的dtrace脚本。我找到了一个在单独的终端上捕获读(2)和写(2)系统调用的示例,如下所示 syscall::read:entry, syscall::write:entry /pid==4217/ { } 指定的pid编号来自另一个终端的pid id。当我看到这个示例时,如果我使用dtrace运行这个脚本,它应该显示一些读写系统调用。但我只观察到读系统调用,而没有观察到写系统调用 所以,如果我理解正确,在我观察到的终端(pid 4217
syscall::read:entry,
syscall::write:entry
/pid==4217/
{
}
指定的pid编号来自另一个终端的pid id。当我看到这个示例时,如果我使用dtrace运行这个脚本,它应该显示一些读写系统调用。但我只观察到读系统调用,而没有观察到写系统调用
所以,如果我理解正确,在我观察到的终端(pid 4217)上,如果我在该终端上键入某个内容,内核将读取它的字符,所以假设发生了read syscall。如果我键入类似“ls”的内容并按enter键,内核将读取并执行它,并将一些输出写入终端,从而编写假定要调用的syscall。但是我没有看到任何写系统调用。为什么会这样?我首先要验证write()是否适用于任何其他进程,例如,一个简单的测试用例。在您的示例中,可能(a)是错误的pid,或者是执行写入操作的子项,或者(b)未使用写入调用,但可能是,例如writev()或其他调用(可能尝试使用strace验证)。我同意@PaulFox,这可能是错误的
pid
值。当终端在按下Enter之前暂停时,终端位于<代码> Read < /Cord> SysCar。但是,当它打印终端提示时(在您按enter键并运行ls
之后),它会通过执行write
syscall来执行此操作。请注意,ls
的输出不是write
syscall的来源!该pid
将是正在运行的ls
命令的进程id
要测试write
syscall是否实际工作,请运行以下命令:
# dtrace -n 'syscall::write:entry {printf("hello")}'
然后以您的终端(用您正在使用的任何东西替换“bash”)为目标进行尝试:
# dtrace -n 'syscall::write:entry /pid==$target/ {printf("hello")}' -c 'bash'
如果其中一个在您将内容键入终端时无法显示任何写入内容,请发回
还请注意,shell可能正在使用几种版本的write系统调用(尽管如果它使用的不是普通的write
,我会感到惊讶):
# dtrace -ln 'syscall::*write*:entry'
ID PROVIDER MODULE FUNCTION NAME
147 syscall write entry
381 syscall writev entry
447 syscall pwrite entry
777 syscall aio_write entry
933 syscall write_nocancel entry
963 syscall writev_nocancel entry
969 syscall pwrite_nocancel entry