[Info-vax] %SYSTEM-F-ACCVIO in LIBOTS after several hours

Mark Daniel mark.daniel at wasd.vsm.com.au
Wed Mar 9 09:49:25 EST 2022


On 10/3/22 12:49 am, Arne Vajhøj wrote:
> On 3/9/2022 8:58 AM, Mark Daniel wrote:
>>> On 2022-03-08, Mark Daniel <mark.daniel at wasd.vsm.com.au> wrote:
>>>> Reproducible after several hours of continuous execution.
>>>>
>>>>> %SYSTEM-F-ACCVIO, access violation, reason mask=04, virtual 
>>>>> address=0000000000039B00, PC=FFFFFFFF842341D0, PS=0000001B
>>>>> %TRACE-F-TRACEBACK, symbolic stack dump follows
>>>>> image     module    routine               line      rel PC abs PC
>>>>> LIBOTS                                       0 00000000000121D0 
>>>>> FFFFFFFF842341D0
>>>>> DECC$SHR  C$TXDOPRINT  putbuf            43567 000000000000CA82 
>>>>> FFFFFFFF84BC4FA2
>>>>> DECC$SHR  C$TXDOPRINT  decc$$txdoprint   43658 000000000000CD62 
>>>>> FFFFFFFF84BC5282
>>>>> DECC$SHR  C$TXDOPRINT  sprintf           44192 0000000000012492 
>>>>> FFFFFFFF84BCA9B2
>>>>> HTTPDMON  HTTPDMON  TcpIpLookup          60709 00000000000109A2 
>>>>> 00000000000409A2
>>>>> HTTPDMON  HTTPDMON  AddRequest           60536 0000000000009A62 
>>>>> 0000000000039A62
>>>>> HTTPDMON  HTTPDMON  MonitorHttpd         58867 0000000000001392 
>>>>> 0000000000031392
>>>>> HTTPDMON  HTTPDMON  main                 58751 0000000000000962 
> 
>>>> Line 60790 is
>>>>
>>>>>        3   60709             sprintf (ares[aCacheIdx], "[%s]", 
>>>>> strerror(errno));
> 
>> Should be.
>>
>> #define CACHE_MAX 16
>>
>>     static  aCacheIdx, nCacheIdx;
>>     static char  abuf [CACHE_MAX][256],
>>                  ares [CACHE_MAX][256],
>>                  nbuf [CACHE_MAX][256],
>>                  nres [CACHE_MAX][256];
>> 8< snip 8<
>>        idx = nCacheIdx++ % CACHE_MAX;
> 
> And similar for aCacheIdx I presume.

Yes.

       idx = nCacheIdx++ % CACHE_MAX;

>> The ACCVIO is very indeterminate.  I mean the CACHE_MAX limit (16) 
>> will have been round-robined many times in the 8+ hours since last 
>> activated.   There are thousands/16 over that period.
> 
> I would put in a:
> 
> if(aCacheIdx < 0 || CACHE_MAX <= aCacheIdx)
> {
>      printf("We have a problem aCacheIdx = %d\n", aCacheIdx);
> }
> sprintf (ares[aCacheIdx], "[%s]", strerror(errno));
> 
> Or maybe:
> 
> if(aCacheIdx < 0 || CACHE_MAX <= aCacheIdx)
> {
>      printf("We have a problem aCacheIdx = %d\n", aCacheIdx);
> }

As "debug" statements; can be done.  Would signal on corruption of the 
indices.

2147483647 is a big number of lookups.

At 100/S that's ~249 days before rollover.

The maximum lookup rate is actually once every 2 seconds.

> if(strlen(strerror(errno)) > 255)
> {
>      printf("We have a problem strlen(strrerror) = %d\n", 
> strlen(strerror(errno)));
> }
> sprintf (ares[aCacheIdx], "[%s]", strerror(errno));

As a "debug" statement; can do.

The move to snprintf() should mitigate any effect though.

Will wait and see if that has any effect.

> Something must be overwriting something.

Yes.  And most commonly laid at the feet (or fingertips) of the developer.

> Multithreaded code?

No.

> Arne

-- 
Anyone, who using social-media, forms an opinion regarding anything 
other than the relative cuteness of this or that puppy-dog, needs 
seriously to examine their critical thinking.



More information about the Info-vax mailing list