1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 <2022> 2023 2024 2025 | Index | 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 <2022> 2023 2024 2025 |
<== Date ==> | <== Thread ==> |
---|
Subject: | RE: [EXTERNAL] Bus errors accessing VME with base 7.0.6.1 and latest synApps modules |
From: | Mark Rivers via Tech-talk <tech-talk at aps.anl.gov> |
To: | "Hartman, Steven" <hartmansm at ornl.gov> |
Cc: | "tech-talk at aps.anl.gov" <tech-talk at aps.anl.gov> |
Date: | Thu, 9 Jun 2022 20:03:04 +0000 |
The failure is very sensitive to minor changes to the source code. If I add the following simple check of the value of pfl->u.r.dtor then there are no bus errors in over 2500 seconds. diff --git a/modules/database/src/ioc/db/dbEvent.c b/modules/database/src/ioc/db/dbEvent.c index 9fcc1ee..7b9970d 100644 --- a/modules/database/src/ioc/db/dbEvent.c +++ b/modules/database/src/ioc/db/dbEvent.c @@ -1199,7 +1199,12 @@ void db_delete_field_log (db_field_log *pfl) { if (pfl) { /* Free field if reference type field log and dtor is set */ - if (pfl->type == dbfl_type_ref && pfl->u.r.dtor) pfl->u.r.dtor(pfl); + if (pfl->type == dbfl_type_ref && pfl->u.r.dtor) { + if ((pfl->u.r.dtor >= (dbfl_freeFunc *)0x80000000) && (pfl->u.r.dtor <= (dbfl_freeFunc *)0xBFFFFFFF)) { + printf("db_delete_field_log pfl->u.r.dtor is in A32 address space %p\n", pfl->u.r.dtor); + } + pfl->u.r.dtor(pfl); + } /* Free the field log chunk */ freeListFree(dbevFieldLogFreeList, pfl); } If I then comment out those lines like this then I get a bus error in less than 20 seconds. corvette:local/epics-devel/base-7.0.6>git diff modules diff --git a/modules/database/src/ioc/db/dbEvent.c b/modules/database/src/ioc/db/dbEvent.c index 9fcc1ee..6addadc 100644 --- a/modules/database/src/ioc/db/dbEvent.c +++ b/modules/database/src/ioc/db/dbEvent.c @@ -1199,7 +1199,12 @@ void db_delete_field_log (db_field_log *pfl) { if (pfl) { /* Free field if reference type field log and dtor is set */ - if (pfl->type == dbfl_type_ref && pfl->u.r.dtor) pfl->u.r.dtor(pfl); + if (pfl->type == dbfl_type_ref && pfl->u.r.dtor) { +// if ((pfl->u.r.dtor >= (dbfl_freeFunc *)0x80000000) && (pfl->u.r.dtor <= (dbfl_freeFunc *)0xBFFFFFFF)) { +// printf("db_delete_field_log pfl->u.r.dtor is in A32 address space %p\n", pfl->u.r.dtor); +// } + pfl->u.r.dtor(pfl); + } /* Free the field log chunk */ freeListFree(dbevFieldLogFreeList, pfl); } Mark From: Hartman, Steven <hartmansm at ornl.gov>
... ... -- |