Re: Using vdr-dpg package for bug hunting?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Am 01.12.24 um 16:56 schrieb Marko Mäkelä:
Sun, Dec 01, 2024 at 02:18:02PM +0100, schorpp wrote:
HA! I've got this bitch of intermittent bug finally:

Program received signal SIGFPE, Arithmetic exception.
[Switching to Thread 0xad0ffb40 (LWP 27522)]
0x08136f6a in cFrameDetector::Analyze (this=0x9ade480, Data=<optimized out>, Length=296852) at remux.c:1567 1567                           uint32_t Delta = ptsValues[0] / (framesPerPayloadUnit +  parser->IFrameTemporalReferenceOffset());

It would have been useful to include the disassembly of the function.
Maybe alos the output fo the following, if the values are known to the debugger:

print ptsValues[0]
print framesPerPayloadUnit
print parser->iFrameTemporalReferenceOffset

AAAh sorry I forgot so many things, the last time I used assembler was tracing a kernel driver bug years ago.

Now we must wait for days again for the still not identified use case the exception is risen for again :/


I was curious about this. I am able to reproduce SIGFPE on both x86-64 and i386 when compiling the following C program without optimization:

#include <stdint.h>
#include <stdio.h>
#include <inttypes.h>
int main()
{
   int a = 0, b = -1;
   uint32_t pts = 1U << 31;
   int32_t delta = ((int32_t)pts) / (a + b);
   printf("%" PRIi32 "\n", delta);
   return 0;
}

Initially I had "uint32_t delta" and no type cast, and PRIu32, to exactly match the data types that are involved in VDR. That variant would produce the incorrect result 0. This of course is a bad approximation for the code in VDR, because above it is possible to perform all the arithmetics at compilation time. In VDR, the values would be determined at runtime.

yes.

Can we just catch and handle this C++ exception somehow?


Curiously, if I compile the above program with GCC 14.2.0 -O2, then it will return the incorrect result -2147483648 instead of an approximation like 2147483647 (which would be one less than the correct result, which cannot be represented in int32_t). If I look at the disassembly, the compiler would have performed an incorrect constant folding for "delta".

If I compile the program with -fsanitize=undefined, it will flag an error:

runtime error: division of -2147483648 by -1 cannot be represented in type 'int'

For the non-optimized case, for both i386 and x86-64, I see that the SIGFPE is being raised by an idiv instruction that is preceded by ctld a.k.a. cdq: https://www.felixcloutier.com/x86/cwd:cdq:cqo

Interesting :)

Is this a case for the gcc-dev mailinglist? Then CC them if on list.


Aussume it is a divide by zero exception?

I don't know if your case involves the idiv instruction, but https:// www.felixcloutier.com/x86/idiv mentions that #DE may be raised both on a division by zero and on overflow.

Can you post the output of "disassemble" and "info registers" for the innermost stack frame?

yes, if it occours again


     Marko

y
tom




[Index of Archives]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Big List of Linux Books]     [Fedora Users]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux