2011-08-20 11 views
18

Para fines de depuración necesito probar un puntero para ver si apunta a una página legible válida. Actualmente estoy analizando/proc/[pid]/maps para ver si la dirección está mapeada, pero esto parece un poco largo. ¿Hay una mejor manera? Gracias.Cómo probar si una dirección es legible en la aplicación de espacio de usuario de linux

+1

Lo estoy haciendo analizando '/ proc/self/maps' también –

+0

@GregoryPakosz: para que sea una solución genérica y confiable, ¿no sería necesario volver a cargar y reparar el mapa en cada cheque para dar cuenta de las cosas como un montón creciente o segmentos de memoria recién mapeados? – etherice

+0

@etherice: No porque/proc es refrescante; cada vez que accede a un/a archivo (s) de/proc, se ejecuta el código del núcleo que lo regenera como "contenido". – kaiwan

Respuesta

17

La manera canónica es utilizar la llamada del sistema write() para leer de la página (escribir en un descriptor de archivo pipe() ficticio). En lugar de fallar, devolverá -1 con errno == EFAULT si el buffer a escribir es ilegible.

+0

¡Gracias, esto funciona como un regalo! – gimmeamilk

+3

Advertencia: He visto al menos otra solución de SO que sugiere usar/dev/null para este propósito (http://stackoverflow.com/questions/4611776/isbadreadptr-analogue-on-unix), pero núcleos más nuevos (he probado en 3.8 .7) return success para/dev/null write() incluso si 'buf' es NULL. Entonces, aunque esta prueba podría funcionar con/dev/null en cualquier sistema que esté probando, definitivamente no es una solución portátil. Usar algún otro fd (como un tubo ficticio o un objeto posix shm) no sería tan rápido, pero definitivamente sería más seguro y portátil. – etherice

Cuestiones relacionadas