1 Star2 Stars3 Stars4 Stars5 Stars (还没有评分)
Loading...

DTrace tricks and tips (7) – 使用copyin和copyinstr 需要注意的问题

在使用copyincopyinstr这两个函数时,要注意这两个函数所访问的地址空间一定要被应用程序已经访问过了。举个例子:

# 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所指向的地址虽然是有效地址,但是由于访问时这段地址所在的页面还没有装载到内存里,所以会报这个错误。解决的办法是,等应用程序访问这个地址后,再用copyincopyinstr访问:

# 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   

可以看到在触发entryprobe后,只是记下了地址的值,而打印这段地址的内容是在触发closeprobe的时候。

参考资料:
(1)http://dtrace.org/guide/chapter33.html

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.