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?
Odpowiedz
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.
Dzięki, to działa jako uczta! – gimmeamilk
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
Robię to parsując '/ proc/self/maps' oraz –
@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
@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