2011-08-20 16 views
18

Do celów debugowania muszę przetestować wskaźnik, aby sprawdzić, czy wskazuje on prawidłową czytelną stronę. Obecnie parsuję/proc/[pid]/maps, aby sprawdzić, czy adres jest odwzorowany w porządku, ale wydaje się to nieco rozwlekłe. Czy istnieje lepszy sposób? Dzięki.Jak sprawdzić, czy adres jest czytelny w aplikacji przestrzeni użytkownika dla systemu Linux?

+1

Robię to parsując '/ proc/self/maps' oraz –

+0

@GregoryPakosz: Żeby to było ogólne i niezawodne rozwiązanie, nie wymagałoby przeładowania i reparacji mapy przy każdym sprawdzeniu w celu rozliczenia rzeczy jak rosnąca kupa lub nowo zmapowane segmenty pamięci? – etherice

+0

@etherice: Nie, ponieważ/proc jest samo-odświeżający; za każdym razem, gdy uzyskujesz dostęp do pliku/proc, uruchamia się kod jądra, który regeneruje "zawartość". – kaiwan

Odpowiedz

17

Kanoniczny sposób polega na użyciu wywołania systemowego write() w celu odczytania ze strony (zapis do atrapa pliku pipe()). Zamiast błędu, zwróci -1 z errno == EFAULT, jeśli bufor do zapisu jest nieczytelny.

+0

Dzięki, to działa jako uczta! – gimmeamilk

+3

Ostrzeżenie: Widziałem co najmniej jedno inne rozwiązanie SO sugerujące użycie/dev/null w tym celu (http://stackoverflow.com/questions/4611776/isbadreadptr-analogue-on-unix), ale nowsze jądra (testowałem na wersji 3.8 .7) zwraca powodzenie dla/dev/null write(), nawet jeśli 'buf' ma wartość NULL. Podczas gdy ten test może działać z/dev/null na dowolnym systemie, który testujesz, zdecydowanie nie jest to rozwiązanie przenośne. Użycie jakiegoś innego fd (takiego jak fikcyjna rura lub obiekt posix shm) nie byłoby tak szybkie, ale z pewnością byłoby bezpieczniejsze i bardziej przenośne. – etherice