//------------------------------------------------------------------- // segvtrap.cpp // // This program shows how a signal-handler can be used to help // diagnose the cause of a 'Segmentation Violation' exception. // // programmer: ALLAN CRUSE // written on: 11 MAY 2005 //------------------------------------------------------------------- #include // for printf() #include // for exit() #include // for sigaction() void my_sigaction( int signum, siginfo_t *si, void *data ) { struct sigcontext *sc = (struct sigcontext *)((int)data+20); // display CPU registers printf( "\nsignal %d ", signum ); printf( "EFLAGS=%08lX ", sc->eflags ); printf( "\n" ); printf( "EAX=%08lX ", sc->eax ); printf( "EBX=%08lX ", sc->ebx ); printf( "ESP=%08lX ", sc->esp ); printf( "SS=%04lX ", sc->ss ); printf( "ES=%04lX ", sc->es ); printf( "\n" ); printf( "ECX=%08lX ", sc->ecx ); printf( "EDX=%08lX ", sc->edx ); printf( "EIP=%08lX ", sc->eip ); printf( "CS=%04lX ", sc->cs ); printf( "FS=%04lX ", sc->fs ); printf( "\n" ); printf( "ESI=%08lX ", sc->esi ); printf( "EDI=%08lX ", sc->edi ); printf( "EBP=%08lX ", sc->ebp ); printf( "DS=%04lX ", sc->ds ); printf( "GS=%04lX ", sc->gs ); printf( "\n" ); // display stack-values unsigned long *lp = (unsigned long *)sc->esp; printf( "\n[SS:ESP] " ); for (int i = 0; i < 5; i++) printf( "%08X ", lp[i] ); // display instruction-stream unsigned char *ip = (unsigned char *)sc->eip; printf( "\n[CS:EIP] " ); for (int i = 0; i < 15; i++) printf( "%02X ", ip[i] ); printf( "\n\n" ); // terminate this program with status-code 1 exit( 1 ); } int main( int argc, char **argv ) { // install our signal-handler static struct sigaction sa = {0}; sigemptyset( &sa.sa_mask ); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = my_sigaction; sigaction( SIGSEGV, &sa, NULL ); // setup registers with demonstration values asm(" movl $0xAAAAAAAA, %eax "); asm(" movl $0xBBBBBBBB, %ebx "); asm(" movl $0xCCCCCCCC, %ecx "); asm(" movl $0xDDDDDDDD, %edx "); asm(" movl $0xEEEEEEEE, %esi "); asm(" movl $0xFFFFFFFF, %edi "); // try to execute a privileged instruction asm(" hlt "); // terminate this program with status-code 0 exit( 0 ); }