[Issue 5517] SEGV: assert(false) in release mode
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Mar 9 12:13:52 PST 2011
http://d.puremagic.com/issues/show_bug.cgi?id=5517
--- Comment #8 from Iain Buclaw <ibuclaw at ubuntu.com> 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: -------
More information about the Digitalmars-d-bugs
mailing list