2011-08-20 15 views
18

Per motivi di debug devo testare un puntatore per vedere se punta a una pagina leggibile valida. Attualmente sto analizzando/proc/[pid]/maps per vedere se l'indirizzo è mappato ok, ma questo sembra un po 'prolisso. C'è un modo migliore? Grazie.Come verificare se un indirizzo è leggibile nell'app dello spazio utente linux

+1

Sto eseguendo l'analisi di '/ proc/self/maps' pure –

+0

@GregoryPakosz: Per essere una soluzione generica e affidabile, non richiederebbe ricaricare e riorganizzare la mappa ad ogni controllo per tenere conto delle cose come un mucchio crescente o segmenti di memoria appena mappati? – etherice

+0

@etherice: No perché/proc è autoaggiornante; ogni volta che si accede a un file/proc, viene eseguito il codice del kernel che rigenera il suo "contenuto". – kaiwan

risposta

17

Il modo canonico consiste nell'utilizzare la chiamata di sistema write() per leggere dalla pagina (scrivendo in un descrittore di file fittizio pipe()). Invece di errori, restituirà -1 con errno == EFAULT se il buffer da scrivere non è leggibile.

+0

Grazie, questo funziona a meraviglia! – gimmeamilk

+3

Attenzione: ho visto almeno un'altra soluzione SO suggerire di utilizzare/dev/null per questo scopo (http://stackoverflow.com/questions/4611776/isbadreadptr-analogue-on-unix), ma i nuovi kernel (ho testato il 3.8 .7) return success per/dev/null write() anche se 'buf' è NULL. Quindi, anche se questo test potrebbe funzionare con/dev/null su qualsiasi sistema si stia testando, non è sicuramente una soluzione portatile. L'utilizzo di qualche altro file fd (come un dummy pipe o un oggetto posix shm) non sarebbe altrettanto veloce, ma sarebbe sicuramente più sicuro e più portabile. – etherice

Problemi correlati