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

Bug #1928334 reported by Pietro Cristofanilli
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
openjdk-lts (Ubuntu)
Expired
Undecided
Unassigned

Bug Description

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

Revision history for this message
Vladimir Petko (vpa1977) wrote :

Hi, sorry for the late reply, is it still an issue with 11.0.20+8?

Changed in openjdk-lts (Ubuntu):
status: New → Incomplete
Revision history for this message
Launchpad Janitor (janitor) wrote :

[Expired for openjdk-lts (Ubuntu) because there has been no activity for 60 days.]

Changed in openjdk-lts (Ubuntu):
status: Incomplete → Expired
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.