在使用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所指向的地址虽然是有效地址,但是由于访问时这段地址所在的页面还没有装载到内存里,所以会报这个错误。解决的办法是,等应用程序访问这个地址后,再用copyin
或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
可以看到在触发entry
probe后,只是记下了地址的值,而打印这段地址的内容是在触发close
probe的时候。