1 /* $Id: signal.c 3483 2007-05-07 11:18:56Z mquinson $ */
3 /* signal -- what TESH needs to know about signals */
5 /* Copyright (c) 2007 Martin Quinson. */
6 /* All rights reserved. */
8 /* This program is free software; you can redistribute it and/or modify it
9 * under the terms of the license (GNU LGPL) which comes with this package. */
15 is_an_unhandled_exception(DWORD exit_code);
17 typedef struct s_exception_entry
21 }s_exception_entry_t,* exception_entry_t;
23 static const s_exception_entry_t exceptions[] =
25 {EXCEPTION_ACCESS_VIOLATION, "SIGSEGV"},
26 {EXCEPTION_ARRAY_BOUNDS_EXCEEDED, "SIGSEGV"},
27 {EXCEPTION_BREAKPOINT, "SIGTRAP"},
28 {EXCEPTION_DATATYPE_MISALIGNMENT, "SIGBUS"},
29 {EXCEPTION_FLT_DENORMAL_OPERAND, "SIGFPE"},
30 {EXCEPTION_FLT_DIVIDE_BY_ZERO, "SIGFPE"},
31 {EXCEPTION_FLT_INEXACT_RESULT, "SIGFPE"},
32 {EXCEPTION_FLT_INVALID_OPERATION, "SIGFPE"},
33 {EXCEPTION_FLT_OVERFLOW, "SIGFPE"},
34 {EXCEPTION_FLT_STACK_CHECK, "SIGFPE"},
35 {EXCEPTION_FLT_UNDERFLOW, "SIGFPE"},
36 {EXCEPTION_ILLEGAL_INSTRUCTION, "SIGILL"},
37 {EXCEPTION_IN_PAGE_ERROR, "SIGSEGV"},
38 {EXCEPTION_INT_DIVIDE_BY_ZERO, "SIGFPE"},
39 {EXCEPTION_INT_OVERFLOW, "SIGFPE"},
40 {EXCEPTION_STACK_OVERFLOW, "SIGILL"},
41 {EXCEPTION_SINGLE_STEP, "SIGTRAP"},
42 {EXCEPTION_NONCONTINUABLE_EXCEPTION, "SIGILL"},
43 {EXCEPTION_PRIV_INSTRUCTION, "SIGILL"}
45 /* number of the entries in the table of exceptions */
46 #define MAX_EXECPTION ((unsigned int)19)
50 typedef struct s_signal_entry {
53 } s_signal_entry_t,* signal_entry_t;
55 static const s_signal_entry_t signals[] = {
80 {"SIGVTALRM",SIGVTALRM},
82 {"SIGWINCH" ,SIGWINCH},
89 const char* signal_name(DWORD got, char *expected)
91 const char* signal_name(unsigned int got, char *expected)
98 for (i=0; i < MAX_EXECPTION; i++)
99 if (exceptions[i].value == got)
100 return (exceptions[i].signal);
102 if((got == SIGBUS) && !strcmp("SIGSEGV",expected))
105 for (i=0; signals[i].number != -1; i++)
106 if (signals[i].number == got)
107 return (signals[i].name);
110 return bprintf("SIG UNKNOWN (%d)", got);
116 is_an_unhandled_exception(DWORD exit_code)
120 for(i = 0; i < MAX_EXECPTION; i++)
121 if(exceptions[i].value == exit_code)