Public bug reported:

I'm creating a sprin boot application that use opncv to read read n cams using 
rstp protocol an send images to am angular frontend.
After a few the java application died with this error:

    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  SIGSEGV (0xb) at pc=0x00007f879bce3ec8, pid=9190, tid=9262
    #
    # JRE version: OpenJDK Runtime Environment (11.0.11+9) (build 
11.0.11+9-Ubuntu-0ubuntu2.20.04)
    # Java VM: OpenJDK 64-Bit Server VM (11.0.11+9-Ubuntu-0ubuntu2.20.04, mixed 
mode, sharing, tiered, compressed oops, g1 gc, linux-amd64)
    # Problematic frame:
    # C  [libc.so.6+0xbeec8]
    #
    # Core dump will be written. Default location: Core dumps may be processed 
with "/usr/share/apport/apport %p %s %c %d %P %E" (or dumping to 
/home/pietro/data/passportWS/opencv-facedetection-master/core.9190)
    #
    # An error report file with more information is saved as:
    # 
/home/pietro/data/passportWS/opencv-facedetection-master/hs_err_pid9190.log
    #
    # If you would like to submit a bug report, please visit:
    #   https://bugs.launchpad.net/ubuntu/+source/openjdk-lts
    # The crash happened outside the Java Virtual Machine in native code.
    # See problematic frame for where to report the bug.
    #
the code is above

    @Slf4j
    public class WebCamService {
        public WebCamService(WebCam camData) {
                cam.setName(camData.getName());
                String url;
                if ( Strings.allHaveText(camData.getLogin(), 
camData.getPassword() ) ) {
                        url = String.format( CREDENTIAL_URL_TEMPLATE, 
Utils.getUrlProtocol( camData.getUrl() ),camData.getLogin(), 
camData.getPassword(), Utils.getUrlAddress( camData.getUrl() ) );
                } else {
                        url = camData.getUrl();
                }
                cam.setHost( url );
                this.id = camData.getId();

                if ( Strings.hasText( camData.getSilhouettes() ) ) {
                        types = Arrays.asList( 
camData.getSilhouettes().split(",") );
                } else {
                        types = new ArrayList<String>();
                }
        }

        private static final String CREDENTIAL_URL_TEMPLATE = "%s://%s:%s@%s";
        private static final String TOPIC_TEMPLATE = "/topic/%s%s";
        private static final String IMG_VIDEO_TEMPLATE = "%s/%s";
        
        private List<String> types;
        
        @Autowired
    private SimpMessagingTemplate template;

    @Autowired
    private NeuralProcessor neuralProcessor;
        private WebCamViewer cam = new WebCamViewer();

        private ExecutorService read;
        
        private ExecutorService work;
        
        @Value("${video.dir.path}")
        private String videoDirPath;
        
        @Value("${image.dir.path}")
        private String imageDirPath;
        
        private AtomicBoolean screenshot = new AtomicBoolean(false);

        private Long id;
        
        public Long getId() {
                return id;
        }
        
        public void setId(Long id) {
                this.id = id;
        }
        
        public boolean startCam() {
                cam.open();

                if (!cam.isOpened()) {
                        log.error("Error opening video camera {}", 
cam.getName() );
                } else {
                        read = Executors.newSingleThreadExecutor();
                        work = Executors.newSingleThreadExecutor();
                        String streamTopic = String.format( TOPIC_TEMPLATE, "", 
getId() );
                        String screenTopic = String.format( TOPIC_TEMPLATE, 
"screen_", getId() );
                        
                        
                        log.info("Video camera {} is opened", cam.getName() );
                        
                        Object _self = this;

                        AtomicReference<Mat> atomicFrame = new 
AtomicReference<Mat>();
                        read.execute(() -> {
                                Mat f = new Mat();
                                int idx = 0;
                                while (!read.isShutdown() && cam.isOpened()) {
                                        
                                        synchronized (_self) {
                                                f.release();
                                                if ( cam.read(f) ) {
                                                        atomicFrame.set(f);
                                                }
                                        }
        
                                }
                        });
                        work.execute(() -> {
                                int counter = 0;
                                int err = 0;
                                Mat f = new Mat();
                                List<DnnObject> objs = new 
ArrayList<DnnObject>();
                                while (!work.isShutdown() && cam.isOpened()) {
                                        Mat frame = null;
                                        synchronized (_self) {
                                                frame = atomicFrame.get();
                                                if ( frame != null ) {
                                                        frame.copyTo(f);
                                                        frame = f;
                                                }
                                        }
                                        
                                        if (frame != null) {
                                                if (frame.empty()) {
                                                        err++;
                                                } else {
                                                        err = 0;
                                                        if (++counter % 15 == 
0) {
                                                                counter = 0;
                                                                
neuralProcessor.getObjectsInFrame(objs,frame, false, types);
                                                        }
                                                        if ( screenshot.get() ) 
{
                                                                try {
                                                                        if ( 
Utils.saveImage( frame, Utils.generateFilename( 
String.format(IMG_VIDEO_TEMPLATE, imageDirPath, cam.getName() ), "jpg" )  ) ) {
                                                                                
this.template.convertAndSend( screenTopic, Utils.getBase64( frame ) );
                                                                                
screenshot.set(false);
                                                                        }
                                                                } catch 
(MessagingException e) {
                                                                        
log.error("Error sending topic of screenshoot {}", e);
                                                                } catch 
(IOException e) {
                                                                        
log.error("Error sending topic of screenshoot {}", e);
                                                                }
                                                        }
                                                        final Mat f1 = frame;
                                                        objs.forEach(obj -> 
Imgproc.rectangle(f1, obj.getRightTop(), obj.getLeftBottom(), new Scalar(255, 
255, 0) ) );
                                                    try {
                                                                
this.template.convertAndSend(streamTopic, Utils.getBase64(frame));
                                                        } catch 
(MessagingException e) {
                                                                
log.error("Error sending topic {}", e);
                                                        } catch (IOException e) 
{
                                                                
log.error("Error sending topic {}", e);
                                                        }
                                                }
                                                frame.release();
                                                if (err >= 10) {
                                                        stopCam();
                                                }
                                        }
                                }
                        });
                }
                return cam.isOpened();
        }

        public boolean stopCam() {
                stopRecording();
                if ( read != null && !read.isTerminated() ) {
                        read.shutdown();
                }
                if ( work != null && !work.isTerminated() ) {
                        work.shutdown();
                }
                cam.close();
                return !cam.isOpened();
        }
        public void takeScreenshot() {
                if ( cam.isOpened() ) {
                        screenshot.set( true );
                }
        }

        public boolean isOn() {
                return cam.isOpened();
        }
    }

where WebCamViewer is a simple wrapper of VideoCapture.

In the spring-boot starter class there is an executor that every 30
seconds call

    System.runFinalization();
        System.gc();

I'd appreciate any advice or direction on how to solve this, thanks
    
full statck trace here 
https://drive.google.com/file/d/114FV0dZ3a_nXIYUrR8SBrXp-lBwuPojd/view?usp=sharing

** Affects: openjdk-lts (Ubuntu)
     Importance: Undecided
         Status: New

-- 
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/1928334

Title:
  openjdk 11 crash with SIGSEGV (0xb) at pc=0x00007f879bce3ec8,
  pid=9190, tid=9262 using opencv 4.5.1 on ubuntu 20.04

To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/openjdk-lts/+bug/1928334/+subscriptions

-- 
ubuntu-bugs mailing list
ubuntu-bugs@lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs

Reply via email to