http://d.puremagic.com/issues/show_bug.cgi?id=5517
--- Comment #8 from Iain Buclaw <[email protected]> 2011-03-09 12:10:47 PST --- Some notes: - sigaction can be used to catch signals - signals caught have a packed struct with some simple information attached. - si_signo: Signal number (ie: SIGSEGV = 11). - si_errno: Errno value (unused on Linux). - si_code: Signal code to indicate why this signal was sent. - The two possible signal codes related to SIGSEGV signals are: - SEGV_MAPERR: address not mapped to object - SEGV_ACCERR: invalid permissions for mapped object - General purpose signal codes tell how the signal was raised: - SI_USER: kill, sigsend or raise - SI_KERNEL: The kernel - SI_QUEUE: sigqueue - SI_TIMER: timer expired - SI_MESGQ: mesq state changed - SI_ASYNCIO: AIO completed - SI_SIGIO: queued SIGIO - HLT is emitted from the kernel (SI_KERNEL). Here is a quick sample program: import core.stdc.stdio; import core.sys.posix.unistd; import core.sys.posix.signal; extern(C) void signal_handler(int signum, siginfo_t* info, void* ptr) { if (info.si_signo == SIGSEGV && info.si_code == SI_KERNEL) { fprintf(stderr, "assert(0) or SEGV sent by kernel\n"); _exit(signum); } } void main() { sigaction_t action; action.sa_flags = SA_SIGINFO | SA_RESETHAND; action.sa_sigaction = &signal_handler; sigaction(SIGSEGV, &action, null); assert(0); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
