Minor improvements on signal handler
This commit is contained in:
parent
72b4809da0
commit
4048c50a69
|
@ -314,11 +314,13 @@ static char mytstack[MYSTACKSIZE]; // alternative stack for signal handler
|
||||||
static bool bStackBelowHeap=false;
|
static bool bStackBelowHeap=false;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* \return true if address is supposed to be on stack (contrary to heap or elsewhere).
|
* \return true if address is supposed to be on stack (contrary to heap or elsewhere). If ptr is 0 false will be returned.
|
||||||
* If unknown better return false.
|
* If unknown better return false.
|
||||||
*/
|
*/
|
||||||
static bool isAddressOnStack(const void* ptr)
|
static bool isAddressOnStack(const void* ptr)
|
||||||
{
|
{
|
||||||
|
if (nullptr==ptr)
|
||||||
|
return false;
|
||||||
char a;
|
char a;
|
||||||
if (bStackBelowHeap)
|
if (bStackBelowHeap)
|
||||||
return ptr < &a;
|
return ptr < &a;
|
||||||
|
@ -336,7 +338,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
{
|
{
|
||||||
int type = -1;
|
int type = -1;
|
||||||
pid_t killid = getpid();
|
pid_t killid = getpid();
|
||||||
const ucontext_t* uc = reinterpret_cast<const ucontext_t*>(context);
|
const ucontext_t* const uc = reinterpret_cast<const ucontext_t*>(context);
|
||||||
#if defined(__linux__) && defined(REG_ERR)
|
#if defined(__linux__) && defined(REG_ERR)
|
||||||
killid = (pid_t) syscall(SYS_gettid);
|
killid = (pid_t) syscall(SYS_gettid);
|
||||||
if (uc) {
|
if (uc) {
|
||||||
|
@ -347,7 +349,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
const char * const sigtext = strsignal(signo);
|
const char * const sigtext = strsignal(signo);
|
||||||
bool bPrintCallstack=true;
|
bool bPrintCallstack=true;
|
||||||
const bool isaddressonstack = isAddressOnStack(info->si_addr);
|
const bool isaddressonstack = isAddressOnStack(info->si_addr);
|
||||||
FILE* f=CppCheckExecutor::getExceptionOutput()=="stderr" ? stderr : stdout;
|
FILE* f = (CppCheckExecutor::getExceptionOutput()=="stderr") ? stderr : stdout;
|
||||||
fputs("Internal error: cppcheck received signal ", f);
|
fputs("Internal error: cppcheck received signal ", f);
|
||||||
fputs(signame, f);
|
fputs(signame, f);
|
||||||
fputs(", ", f);
|
fputs(", ", f);
|
||||||
|
@ -377,8 +379,8 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fprintf(f, " (at 0x%p).\n",
|
fprintf(f, " (at 0x%lx).\n",
|
||||||
info->si_addr);
|
(unsigned long)info->si_addr);
|
||||||
break;
|
break;
|
||||||
case SIGFPE:
|
case SIGFPE:
|
||||||
switch (info->si_code) {
|
switch (info->si_code) {
|
||||||
|
@ -409,8 +411,8 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fprintf(f, " (at 0x%p).\n",
|
fprintf(f, " (at 0x%lx).\n",
|
||||||
info->si_addr);
|
(unsigned long)info->si_addr);
|
||||||
break;
|
break;
|
||||||
case SIGILL:
|
case SIGILL:
|
||||||
switch (info->si_code) {
|
switch (info->si_code) {
|
||||||
|
@ -441,8 +443,8 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fprintf(f, " (at 0x%p).%s\n",
|
fprintf(f, " (at 0x%lx).%s\n",
|
||||||
info->si_addr,
|
(unsigned long)info->si_addr,
|
||||||
(isaddressonstack)?" Stackoverflow?":"");
|
(isaddressonstack)?" Stackoverflow?":"");
|
||||||
break;
|
break;
|
||||||
case SIGINT:
|
case SIGINT:
|
||||||
|
@ -460,10 +462,10 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
fprintf(f, " (%sat 0x%p).%s\n",
|
fprintf(f, " (%sat 0x%lx).%s\n",
|
||||||
(type==-1)? "" :
|
(type==-1)? "" :
|
||||||
(type==0) ? "reading " : "writing ",
|
(type==0) ? "reading " : "writing ",
|
||||||
info->si_addr,
|
(unsigned long)info->si_addr,
|
||||||
(isaddressonstack)?" Stackoverflow?":""
|
(isaddressonstack)?" Stackoverflow?":""
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
|
@ -475,6 +477,7 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
print_stacktrace(f, true, -1 /*(isaddressonstack)?8:-1*/);
|
print_stacktrace(f, true, -1 /*(isaddressonstack)?8:-1*/);
|
||||||
fputs("\nPlease report this to the cppcheck developers!\n", f);
|
fputs("\nPlease report this to the cppcheck developers!\n", f);
|
||||||
}
|
}
|
||||||
|
fflush(f);
|
||||||
|
|
||||||
// now let the system proceed, shutdown and hopefully dump core for post-mortem analysis
|
// now let the system proceed, shutdown and hopefully dump core for post-mortem analysis
|
||||||
signal(signo, SIG_DFL);
|
signal(signo, SIG_DFL);
|
||||||
|
@ -483,7 +486,6 @@ static void CppcheckSignalHandler(int signo, siginfo_t * info, void * context)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USE_WINDOWS_SEH
|
#ifdef USE_WINDOWS_SEH
|
||||||
|
|
||||||
static const ULONG maxnamelength = 512;
|
static const ULONG maxnamelength = 512;
|
||||||
struct IMAGEHLP_SYMBOL64_EXT : public IMAGEHLP_SYMBOL64 {
|
struct IMAGEHLP_SYMBOL64_EXT : public IMAGEHLP_SYMBOL64 {
|
||||||
TCHAR NameExt[maxnamelength]; // actually no need to worry about character encoding here
|
TCHAR NameExt[maxnamelength]; // actually no need to worry about character encoding here
|
||||||
|
@ -698,6 +700,7 @@ static int filterException(int code, PEXCEPTION_POINTERS ex)
|
||||||
}
|
}
|
||||||
fputs("\n", f);
|
fputs("\n", f);
|
||||||
PrintCallstack(f, ex);
|
PrintCallstack(f, ex);
|
||||||
|
fflush(f);
|
||||||
return EXCEPTION_EXECUTE_HANDLER;
|
return EXCEPTION_EXECUTE_HANDLER;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue