copyin() 和 copyinstr() 子例程无法从尚未访问的用户地址读取,因此,如果包含某个地址的页面没有得到访问,则即使该地址有效也可能会产生错误。以下面的示例为例:
# dtrace -n syscall::open:entry'{ trace(copyinstr(arg0)); }' dtrace: description 'syscall::open:entry' matched 1 probe CPU ID FUNCTION:NAME dtrace: error on enabled probe ID 2 (ID 50: syscall::open:entry): invalid address (0x9af1b) in action #1 at DIF offset 52 |
在以上示例输出中,该应用程序运行正常,且 arg0 的地址是有效的,但其引用了尚未被对应进程访问的页面。为解决此问题,请在跟踪前等待内核或应用程序使用相应数据。例如,您可以等到系统调用返回时再应用 copyinstr(),如以下示例所示:
# dtrace -n syscall::open:entry'{ self->file = arg0; }' \ -n syscall::open:return'{ trace(copyinstr(self->file)); self->file = 0; }' dtrace: description 'syscall::open:entry' matched 1 probe CPU ID FUNCTION:NAME 2 51 open:return /dev/null |