Hi Rong,
I still don't understand the error. Your trace shows that the error is happening here:
#8 0x0000000000796160 in paramList::getInteger (this=<optimized out>, index=index@entry=51, value=0xffffffffe050)
at ../../asyn/asynPortDriver/asynPortDriver.cpp:259
This is line 259 in asynPortDriver.cpp in asyn-R4-30
https://github.com/epics-modules/asyn/blob/7f10aeaa8ce798bb00442dc9e44bdb619a409d46/asyn/asynPortDriver/asynPortDriver.cpp#L259
Note that it is calling paramVal::getInteger in a try/catch block that explicitly catches the exception you are getting, ParamValNotDefined. So I don't understand why this is causing your program to terminate, rather than simply catching
the error and return and error status.
It seems like perhaps there is something different about the way C++ exception handling works with the linux-arm architecture? No one has ever reported this error before, but most people are using linux-x86_64.
- Some additional information about quadEM-R7-0 compiling: I initially had compiling error like:
../drvTetrAMM.cpp:258:22: error: narrowing conversion of ‘18443366386873925631’ from ‘long long unsigned int’ to ‘long long int’ [-Wnarrowing] 258 | case 0xfff40002ffffffffll:
So I changed line 258 (and three following case ***** sentences) to:
case static_cast<long long int>(0xfff40002ffffffff):
.....
case static_cast<long long int>(0xfff40000ffffffff):
.....
case static_cast<long long int>(0xfff40001ffffffff):
.....
case static_cast<long long int>(0xfff40003ffffffff):
I hope these changes are irrelevant.
Those errors are fixed in quadEM R9-5. They are not related to the exception errors you are getting.
Mark
-----Original Message-----
From: Rong Huang <ronghuang at ls-cat.org>
Sent: Tuesday, December 19, 2023 5:20 PM
To: Mark Rivers <rivers at cars.uchicago.edu>
Cc: tech-talk at aps.anl.gov
Subject: Re: quadEM-R7-0 ParamValNotDefined
Hello Mark,
Thank you for checking this!
I realized I used the wrong version of asyn after I sent the previous email. I installed asyn-R4-30, re-installed areaDetector, ipUnidig and quadEM-R7-0, but I still get the same error when I start the IOC.
The backtrace printout is as follows:
terminate called after throwing an instance of 'ParamValNotDefined'
what(): paramVal::getInteger value not defined
Thread 1 "quadEMTestApp" received signal SIGABRT, Aborted.
0x0000fffff78d6650 in __pthread_kill_implementation () from /usr/lib64/libc.so.6 Missing separate debuginfos, use: dnf debuginfo-install
glibc-2.34-83.el9_3.7.aarch64 keyutils-libs-1.6.3-1.el9.aarch64
krb5-libs-1.21.1-1.el9.aarch64 libaec-1.0.6-1.el9.aarch64
libcom_err-1.46.5-3.el9.aarch64 libgcc-11.4.1-2.1.el9.aarch64
libjpeg-turbo-2.0.90-6.el9_1.aarch64 libselinux-3.5-1.el9.aarch64
libstdc++-11.4.1-2.1.el9.aarch64 libtirpc-1.3.3-2.el9.aarch64
libxml2-2.9.13-5.el9_3.aarch64 openssl-libs-3.0.7-24.el9.aarch64
pcre2-10.40-2.el9.aarch64 xz-libs-5.2.5-8.el9_0.aarch64
zlib-1.2.11-40.el9.aarch64
(gdb) backtrace
#0 0x0000fffff78d6650 in __pthread_kill_implementation () from
/usr/lib64/libc.so.6
#1 0x0000fffff789186c in raise () from /usr/lib64/libc.so.6
#2 0x0000fffff7879030 in abort () from /usr/lib64/libc.so.6
#3 0x0000fffff7aa491c in __gnu_cxx::__verbose_terminate_handler() () from /usr/lib64/libstdc++.so.6
#4 0x0000fffff7aa22bc in __cxxabiv1::__terminate(void (*)()) () from
/usr/lib64/libstdc++.so.6
#5 0x0000fffff7aa2320 in std::terminate() () from /usr/lib64/libstdc++.so.6
#6 0x0000fffff7aa2604 in __cxa_throw () from /usr/lib64/libstdc++.so.6
#7 0x00000000007b3fc0 in paramVal::getInteger (this=this@entry=0xc0d7c0)
at /usr/include/c++/11/ext/new_allocator.h:89
#8 0x0000000000796160 in paramList::getInteger (this=<optimized out>, index=index@entry=51, value=0xffffffffe050)
at ../../asyn/asynPortDriver/asynPortDriver.cpp:259
#9 0x000000000079627c in asynPortDriver::getIntegerParam (value=<optimized out>, index=51, list=0, this=0xc09ee0)
at ../../asyn/asynPortDriver/asynPortDriver.cpp:1302
#10 asynPortDriver::getIntegerParam (this=0xc09ee0, index=51, value=<optimized out>)
at ../../asyn/asynPortDriver/asynPortDriver.cpp:1289
#11 0x000000000048b364 in NDPluginDriver::connectToArrayPort
(this=this@entry=0xc09ee0) at ../NDPluginDriver.cpp:253
#12 0x000000000044fdc8 in NDPluginStats::NDPluginStats (this=0xc09ee0, portName=<optimized out>,
queueSize=<optimized out>, blockingCallbacks=<optimized out>, NDArrayPort=<optimized out>,
NDArrayAddr=<optimized out>, maxBuffers=<optimized out>, maxMemory=<optimized out>, priority=0, stackSize=0)
at ../NDPluginStats.cpp:838
#13 0x000000000044fe6c in NDStatsConfigure (portName=0xc0fae1 "STATS1", queueSize=20, blockingCallbacks=0,
NDArrayPort=0xc0faed "TetrAMM", NDArrayAddr=0, maxBuffers=0, maxMemory=0, priority=0, stackSize=0)
at ../NDPluginStats.cpp:848
#14 0x000000000044feec in initCallFunc (args=<optimized out>) at
../NDPluginStats.cpp:874
#15 0x0000000000899c00 in iocshBody (
pathname=pathname@entry=0xbdcad0
"/epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/iocBoot/commonPlugins.cmd",
commandLine=commandLine@entry=0x0) at
../../../src/libCom/iocsh/iocsh.cpp:771
#16 0x0000000000899a24 in iocshBody (
pathname=pathname@entry=0xbbe4c0
"/epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/iocBoot/iocTetrAMM/TetrAMM.cmd",
commandLine=commandLine@entry=0x0) at
../../../src/libCom/iocsh/iocsh.cpp:744
#17 0x0000000000899a24 in iocshBody (pathname=<optimized out>, commandLine=<optimized out>)
at ../../../src/libCom/iocsh/iocsh.cpp:744
--Type <RET> for more, q to quit, c to continue without paging--
#18 0x00000000004095f8 in main (argc=<optimized out>, argv=<optimized
out>) at ../quadEMTestAppMain.cpp:16
Some additional information about quadEM-R7-0 compiling: I initially had compiling error like:
../drvTetrAMM.cpp:258:22: error: narrowing conversion of ‘18443366386873925631’ from ‘long long unsigned int’ to ‘long long int’ [-Wnarrowing] 258 | case 0xfff40002ffffffffll:
So I changed line 258 (and three following case ***** sentences) to:
case static_cast<long long int>(0xfff40002ffffffff):
.....
case static_cast<long long int>(0xfff40000ffffffff):
.....
case static_cast<long long int>(0xfff40001ffffffff):
.....
case static_cast<long long int>(0xfff40003ffffffff):
I hope these changes are irrelevant.
Thank you very much!
Rong
On Tue, Dec 19, 2023 at 4:10 PM Mark Rivers <rivers at cars.uchicago.edu> wrote:
>
> Hi Rong,
>
>
>
> You appear to be running asyn R4-36.
>
>
>
> You are getting this error:
>
>
>
> NDStatsConfigure("STATS1", 20, 0, "TetrAMM", 0, 0, 0) terminate called after throwing an instance of 'ParamValNotDefined'
>
> what(): paramVal::getInteger value not defined Aborted (core
> dumped)
>
>
>
> I do not understand that. The only place where paramVal::getInteger should be called is in this line in asynPortDriver R4-36:
>
>
https://github.com/epics-modules/asyn/blob/89c2b93d14cdb7fe48d490785cd
> 7780c1b997277/asyn/asynPortDriver/asynPortDriver.cpp#L288
>
>
>
> Note that paramVal::getInteger is called in a try/catch block, and exception ParamValNotDefined is explicitly caught. So it should simply return asynParamUndefined to the function that called paramList::GetInteger, which is normally
asynPortDriver::getIntegerParam().
>
>
>
> Your error message says that the crash generated a core dump. I think you need to run gdb on that core file and send the output of the gdb “backtrace” command.
>
>
>
> Alternatively you can run the IOC again under gdb as follows:
>
>
>
> gdb ../../bin/linux-arm/quadEMTestApp
>
> run st.cmd
>
>
>
> (when it crashes type this command)
>
> backtrace
>
>
>
> That will show the call stack when it crashed, and we may be able to figure out why it is happening.
>
>
>
> Mark
>
>
>
> -----Original Message-----
> From: Tech-talk <tech-talk-bounces at aps.anl.gov> On Behalf Of Rong
> Huang via Tech-talk
> Sent: Tuesday, December 19, 2023 2:35 PM
> To: tech-talk at aps.anl.gov
> Subject: quadEM-R7-0 ParamValNotDefined
>
>
>
> Hello,
>
>
>
> Sorry I am living in the past. I am trying to install the old version
>
> quadEM-R7-0 to match the EPICS_base version (3.14.12.8) and Asyn version in use.
>
>
>
> I installed everything without vxWorks, with the intention to run the IOC on a PC. Currently working on RHEL linux-arm inside VMware Fusion.
>
>
>
> The TetrAMM instrument is new, but I guess the error message is not
> about hardware but EPICS software. The printout of starting IOC is as
>
> follows:
>
>
>
> [rh@localhost iocTetrAMM]$ ../../bin/linux-arm/quadEMTestApp st.cmd
>
> errlogInit(5000)
>
> < envPaths
>
> epicsEnvSet("ARCH","linux-x86_64")
>
> epicsEnvSet("IOC","iocTetrAMM")
>
> epicsEnvSet("TOP","/epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0
> ")
>
> epicsEnvSet("SUPPORT","/epicsioc/used/epics/synApps_5_8_3_14_8")
>
> epicsEnvSet("AREA_DETECTOR","/epicsioc/used/epics/synApps_5_8_3_14_8/a
> reaDetector-R2-5")
>
> epicsEnvSet("EPICS_BASE","/epicsioc/used/epics/base-3.14.12.8")
>
> epicsEnvSet("ASYN","/epicsioc/used/epics/synApps_5_8_3_14_8/asyn-4-36"
> )
>
> epicsEnvSet("ADSUPPORT","/epicsioc/used/epics/synApps_5_8_3_14_8/areaD
> etector-R2-5/ADSupport")
>
> epicsEnvSet("ADCORE","/epicsioc/used/epics/synApps_5_8_3_14_8/areaDete
> ctor-R2-5/ADCore")
>
> epicsEnvSet("AUTOSAVE","/epicsioc/used/epics/synApps_5_8_3_14_8/autosa
> ve-5-10")
>
> epicsEnvSet("BUSY","/epicsioc/used/epics/synApps_5_8_3_14_8/busy-1-7-2
> ")
>
> epicsEnvSet("CALC","/epicsioc/used/epics/synApps_5_8_3_14_8/calc-3-7-3
> ")
>
> epicsEnvSet("SNCSEQ","/epicsioc/used/epics/synApps_5_8_3_14_8/seq-2-2-
> 7")
>
> epicsEnvSet("SSCAN","/epicsioc/used/epics/synApps_5_8_3_14_8/sscan-2-1
> 1-3")
>
> epicsEnvSet("DEVIOCSTATS","/epicsioc/used/epics/synApps_5_8_3_14_8/ioc
> Stats-3-1-16")
>
> epicsEnvSet("IPAC","/epicsioc/used/epics/synApps_5_8_3_14_8/ipac-2-15"
> )
>
> epicsEnvSet("IPUNIDIG","/epicsioc/used/epics/synApps_5_8_3_14_8/ipUnid
> ig-2-10")
>
> # Tell EPICS all about the record types, device-support modules,
> drivers, # etc. in this build
>
> epicsEnvSet("QUADEM","/epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R
> 7-0")
>
> dbLoadDatabase("/epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/db
> d/quadEMTestApp.dbd")
>
> quadEMTestApp_registerRecordDeviceDriver(pdbbase)
>
> # The search path for database files
>
> # Note: the separator between the path entries needs to be changed to
> a semicolon (;) on Windows epicsEnvSet("EPICS_DB_INCLUDE_PATH",
>
> "/epicsioc/used/epics/synApps_5_8_3_14_8/areaDetector-R2-5/ADCore/db:/
> epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/db")
>
> <
> /epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/iocBoot/iocTetrAMM
> /TetrAMM.cmd
>
> epicsEnvSet("PREFIX", "quadEMTest:")
>
> epicsEnvSet("RECORD", "TetrAMM:")
>
> epicsEnvSet("PORT", "TetrAMM")
>
> epicsEnvSet("TEMPLATE", "TetrAMM")
>
> epicsEnvSet("QSIZE", "20")
>
> epicsEnvSet("RING_SIZE", "10000")
>
> epicsEnvSet("TSPOINTS", "2048")
>
> #epicsEnvSet("IP", "164.54.160.165:10001")
>
> epicsEnvSet("IP", "10.1.17.35:10001")
>
> #drvAsynIPPortConfigure("portName","hostInfo",priority,noAutoConnect,
>
> # noProcessEos)
>
> drvAsynIPPortConfigure("IP_TetrAMM", "10.1.17.35:10001", 0, 0, 0)
> asynOctetSetInputEos("IP_TetrAMM", 0, "\r\n")
> asynOctetSetOutputEos("IP_TetrAMM", 0, "\r") # Set both
> TRACE_IO_ESCAPE (for ASCII command/response) and TRACE_IO_HEX (for
> binary data) asynSetTraceIOMask("IP_TetrAMM", 0, 6)
>
> #asynSetTraceFile("IP_$(PORT)", 0, "AHxxx.out")
>
> #asynSetTraceMask("IP_$(PORT)", 0, 9)
>
> asynSetTraceIOTruncateSize("IP_TetrAMM", 0, 4000) # Load asynRecord
> record
> dbLoadRecords("/epicsioc/used/epics/synApps_5_8_3_14_8/asyn-4-36/db/as
> ynRecord.db",
>
> "P=quadEMTest:, R=asyn1,PORT=IP_TetrAMM,ADDR=0,OMAX=256,IMAX=256")
>
> drvTetrAMMConfigure("TetrAMM", "IP_TetrAMM", 10000)
> dbLoadRecords("/epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/db/
> TetrAMM.template",
>
> "P=quadEMTest:, R=TetrAMM:, PORT=TetrAMM") <
> /epicsioc/used/epics/synApps_5_8_3_14_8/quadEM-R7-0/iocBoot/commonPlug
> ins.cmd
>
> epicsEnvSet("T1", "Current1")
>
> epicsEnvSet("T2", "Current2")
>
> epicsEnvSet("T3", "Current3")
>
> epicsEnvSet("T4", "Current4")
>
> epicsEnvSet("T5", "SumX")
>
> epicsEnvSet("T6", "SumY")
>
> epicsEnvSet("T7", "SumAll")
>
> epicsEnvSet("T8", "DiffX")
>
> epicsEnvSet("T9", "DiffY")
>
> epicsEnvSet("T10", "PosX")
>
> epicsEnvSet("T11", "PosY")
>
> # Create 11 statistics plugins
>
> NDStatsConfigure("STATS1", 20, 0, "TetrAMM", 0, 0, 0) terminate called after throwing an instance of 'ParamValNotDefined'
>
> what(): paramVal::getInteger value not defined Aborted (core
> dumped)
>
>
>
>
>
> Thank you for your attention,
>
> Rong