Mail Archives: cygwin/2002/10/03/17:44:39
Dear List,
In a system I'm writing I need to catch page faults and find out
the fault address and the fault type (read or write). On most unices
I can get this information inside a sigaction handler.
E.g. on Linux, something like this works:
==========================================================
void fault_handler(int sig, siginfo_t * info, void * uap)
{
vm_addr_t addr;
VM::access_t access;
/* fault address */
addr = (vm_addr_t)info->si_addr;
/* 1 for write; 0 for read */
access = (VM::access_t)
((((ucontext_t *)uap)->uc_mcontext.gregs[13] & 0x2) != 0);
...
}
==========================================================
However, cygwin's signal handling mechanism doesn't propagate these
information to the signal handler. On mingw, I can use window's API
to get the info I need:
==========================================================
LONG WINAPI fault_handler(LPEXCEPTION_POINTERS info)
{
vm_addr_t addr;
VM::access_t access;
if (info->ExceptionRecord->ExceptionCode != EXCEPTION_ACCESS_VIOLATION)
return EXCEPTION_CONTINUE_SEARCH;
access = (VM::access_t)info->ExceptionRecord->ExceptionInformation[0];
addr = (vm_addr_t)info->ExceptionRecord->ExceptionInformation[1];
...
}
SetUnhandledExceptionFilter(fault_handler);
==========================================================
However, this doesn't work on cygwin because apparently cygwin is
overriding my own fault handler. So I'm wondering: how can I bypass
cygwin's signal handling mechanism so that I get hold of the page fault
information?
Thanks,
Allen
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Bug reporting: http://cygwin.com/bugs.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -