ATLAS Offline Software
Loading...
Searching...
No Matches
PtrAccessSEGVHandler.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5#define DEBUG 1
6
9#include <cstdio>
10#include <cstdlib>
11
12void
13PtrAccessSEGVHandler::handle(int /*signal_number*/,siginfo_t *sigi,void * /*unused*/) {
14 void *addr=sigi->si_addr;
15#ifdef DEBUG
16 printf("page fault @address=%p\n",sigi->si_addr);
17#ifdef __ARCH_SI_TRAPNO
18 printf("page fault trapno=%d\n",sigi->si_trapno);
19#endif
20 printf("page fault signo=%d\n",sigi->si_signo);
21 printf("page fault errno=%d\n",sigi->si_errno);
22 printf("this page fault failed because ");
23 if (SEGV_MAPERR == sigi->si_code)
24 printf("you tried to access an invalid address\n");
25 else if (SEGV_ACCERR == sigi->si_code) {
26 printf("you tried to access a protected address\n");
27 } else printf(" an unknown reason. Page fault code=%d\n",sigi->si_code);
28#endif
29 //record the access and restore page protection
30 if (SEGV_ACCERR == sigi->si_code) {
31 m_pac.restorePageProt(addr);
32 m_accessed.push_back(addr);
33 } else abort();
34}
This class provides a handle function that logs the addresses that had an access violation....
void handle(int signal_number, siginfo_t *sigi, void *unused)
the actual signal handler
PageAccessControl & m_pac
used to restore protection of the page which segfaulted
accessed_t m_accessed
the addresses accessed since last reset