Las subrutinas copyin() y copyinstr() no se pueden leer desde direcciones de usuario que no se hayan tocado todavía, por lo que incluso una dirección válida puede provocar un error si la página que contiene esa dirección no ha experimentado errores al acceder. Considere el siguiente ejemplo:
# 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 |
En la salida del ejemplo anterior, la aplicación funcionaba correctamente y la dirección de arg0 era válida, pero hacía referencia a una página a la que no había accedido todavía el proceso correspondiente. Para resolver este problema, espere a que el núcleo o la aplicación usen los datos antes de comenzar el seguimiento. Por ejemplo, puede esperar a que la llamada de sistema muestre su resultado para aplicar copyinstr(), tal y como se ilustra en el siguiente ejemplo:
# 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 |