używam sigaction obsłużyć wyjątek strona błędu, a funkcja obsługi jest defind tak:Jak zidentyfikować odczytu lub zapisu operacji od strony błędu podczas korzystania z obsługi sigaction na SIGSEGV (Linux)
void sigaction_handler(int signum, siginfo_t *info, void *_context)
Więc to łatwo uzyskać adres błędu strony czytając info-> si_addr.
Pytanie jest, jak wiadomo, czy ta operacja jest pamięć READ lub NAPISZ?
znalazłem rodzaj _context parametru jest ucontext_t zdefiniowanym w/usr/include/sys/ucontext.h
Jest CR2 pole zdefiniowane w mcontext_t, ale unforunately, to jest tylko dostępna, gdy x86_64 nie jest zdefiniowany, więc nie mogłem użyć cr2 do identyfikacji operacji odczytu/zapisu.
Na anotherway, jest struktura o nazwie sigcontext zdefiniowane w/usr/to/bity/sigcontext.h Ta struktura zawiera CR2 dziedzinie. Ale nie wiem, skąd to wziąć.
Dostęp do informacji o kodzie błędu można uzyskać przez: (kontekst (ucontext_t *)) -> uc_mcontext.gregs [REG_ERR]. Jest przekazywany przez sprzęt na stosie, który jest następnie przekazywany do obsługi sygnału przez jądro, ponieważ jądro przechodzi przez całą "ramkę". –
M. Alaggan, jaki sprzęt? – osgx
Próbowałem go na x86-64. –