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
- 1. Przestrzeń jądra systemu Linux i przestrzeń użytkownika
- 2. Jak znaleźć adres fizyczny zmiennej z przestrzeni użytkownika w systemie Linux?
- 3. Bariery pamięci w przestrzeni użytkownika? (Linux, x86-64)
- 4. Jak ustawić funkcję CAP_SYS_NICE dla użytkownika systemu Linux?
- 5. syslog_r dla systemu Linux?
- 6. Adres IP w C++ czytelny dla człowieka formularz
- 7. Jak sprawdzić, czy skrypt powłoki Linux jest wykonywany przez cronjob?
- 8. Czy adres jest 0xFFFFFFF0 hardwired dla systemu BIOS ROM?
- 9. Jak sprawdzić, czy produkt rozliczeniowy w aplikacji jest już kupiony w aplikacji przez użytkownika?
- 10. Jak zmapować bufor jądra Linux do przestrzeni użytkownika?
- 11. Kernel systemu Linux: copy_from_user - struct ze wskazówkami
- 12. Czy jest jakiś klient GUI Github dla systemu operacyjnego Linux?
- 13. W iOS, jak sprawdzić, czy adres URL jest pusty
- 14. Co jest różnica między android użytkownika systemu i Linux root
- 15. Dobry, mały kompilator Haskell dla systemu Linux?
- 16. Sygnał modułu jądra Linux w procesie przestrzeni użytkownika zabity
- 17. Perfmon-like dla systemu Linux?
- 18. HeapCreate, HeapAlloc w systemie Linux, prywatny przydział dla systemu Linux
- 19. Jak sprawdzić, czy ten wątek jest wątkiem interfejsu użytkownika
- 20. Alternatywa TextMate dla systemu Linux
- 21. Interpreter JavaScript dla systemu Linux
- 22. Emulator BlueStacks dla systemu Linux?
- 23. Czy istnieje biblioteka klienta MS-DRM dla systemu Linux?
- 24. Czy system MISRA-C ma zastosowanie do aplikacji systemu Linux?
- 25. Przeniesienie kodu przestrzeni użytkownika do przestrzeni jądra
- 26. Jak wyzwalać fałszywe budzenie w aplikacji systemu Linux?
- 27. Jak sprawdzić, czy element jest w widoku użytkownika z jquery
- 28. Jak sprawdzić, czy katalog istnieje w systemie Linux?
- 29. sprawdzić, czy Użytkownik jest Grupa użytkownika
- 30. Linux: jak sprawdzić, czy dysk jest podłączony do nfs
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