diff --git a/configure/CONFIG_SITE_ENV b/configure/CONFIG_SITE_ENV index bacbc14a5..bcc3bdf7a 100644 --- a/configure/CONFIG_SITE_ENV +++ b/configure/CONFIG_SITE_ENV @@ -92,3 +92,6 @@ EPICS_IOC_LOG_FILE_NAME= EPICS_IOC_LOG_FILE_COMMAND= EPICS_IOC_LOG_FILE_LIMIT=1000000 +# Set to 'YES' to call abort() rather than suspend the current thread +# when an assert() fails +EPICS_ABORT_ON_ASSERT=NO diff --git a/modules/libcom/src/env/envDefs.h b/modules/libcom/src/env/envDefs.h index 3bf64c861..c54a781c7 100644 --- a/modules/libcom/src/env/envDefs.h +++ b/modules/libcom/src/env/envDefs.h @@ -76,6 +76,7 @@ LIBCOM_API extern const ENV_PARAM EPICS_IOC_LOG_FILE_COMMAND; LIBCOM_API extern const ENV_PARAM IOCSH_PS1; LIBCOM_API extern const ENV_PARAM IOCSH_HISTSIZE; LIBCOM_API extern const ENV_PARAM IOCSH_HISTEDIT_DISABLE; +LIBCOM_API extern const ENV_PARAM EPICS_ABORT_ON_ASSERT; LIBCOM_API extern const ENV_PARAM *env_param_list[]; struct in_addr; diff --git a/modules/libcom/src/osi/os/default/osdAssert.c b/modules/libcom/src/osi/os/default/osdAssert.c index 2d62bc820..23263df4e 100644 --- a/modules/libcom/src/osi/os/default/osdAssert.c +++ b/modules/libcom/src/osi/os/default/osdAssert.c @@ -20,12 +20,14 @@ #include "epicsTime.h" #include "cantProceed.h" #include "epicsStackTrace.h" +#include "envDefs.h" void epicsAssert (const char *pFile, const unsigned line, const char *pExp, const char *pAuthorName) { epicsTimeStamp current; + int shouldAbort = 0; errlogPrintf("\n\n\n" "A call to 'assert(%s)'\n" @@ -50,6 +52,13 @@ void epicsAssert (const char *pFile, const unsigned line, errlogPrintf("Please E-mail this message to %s or to tech-talk@aps.anl.gov\n", pAuthorName); - errlogPrintf("Calling epicsThreadSuspendSelf()\n"); - epicsThreadSuspendSelf (); + if (envGetBoolConfigParam(&EPICS_ABORT_ON_ASSERT, &shouldAbort) == 0 && shouldAbort) { + errlogPrintf("Calling abort()\n"); + errlogFlush(); + abort(); + } + else { + errlogPrintf("Calling epicsThreadSuspendSelf()\n"); + epicsThreadSuspendSelf (); + } }