C#mono console app阅读MJPEG流挂

时间:2017-01-02 06:57:40

标签: c# mono aforge mjpeg strace

我有一个用C#.Net 4.5编写的控制台应用程序,在Linux上运行Mono 3.2.8(Ubuntu 14.04 LTS)。

控制台应用程序作为upstart服务启动,我使用log4net v2.0.5和控制台appender记录输出。

Upstart重定向/ var / log / upstart / {appname} .log

中的所有输出

随机地,几个小时到几天之后,应用程序挂起,我在日志中看不到任何内容。

我所知道的:

  • 磁盘未满
  • 内存未满且没有交换
  • 命令ps显示进程仍在运行
  • 应用程序不再向外部服务器发送数据。正常工作时,外部服务器每隔几秒钟接收一次数据。
  • 不再填充日志文件

我使用命令strace查看最后的系统调用,这就是我得到的:

  

$ strace -p 5602

     

附加过程5602

     

民意调查([{fd = 6,events = POLLIN},{fd = 8,events = POLLIN}],2,-1)=? ERESTART_RESTARTBLOCK(信号中断)

     

--- SIGPWR {si_signo = SIGPWR,si_code = SI_TKILL,si_pid = 5602,si_uid = 1001} ---

     

rt_sigprocmask(SIG_BLOCK,[XCPU],NULL,8)= 0

     

futex(0x26b18c,FUTEX_WAKE_PRIVATE,1)= 1

     

rt_sigsuspend(〜[XCPU RTMIN RT_1])=? ERESTARTNOHAND(如果没有处理程序,则重新启动)

     

--- SIGXCPU {si_signo = SIGXCPU,si_code = SI_TKILL,si_pid = 5602,si_uid = 1001} ---

     

rt_sigreturn()= -1 EINTR(系统调用中断)

     

rt_sigprocmask(SIG_UNBLOCK,[XCPU],NULL,8)= 0

     

futex(0x26b18c,FUTEX_WAKE_PRIVATE,1)= 1

     

rt_sigreturn()= -1 EINTR(系统调用中断)

2个文件描述符6和8是管道:

  

$ file / proc / 5602 / fd / 6

     

/ proc / 5602 / fd / 6:破坏管道的符号链接:[6562495]'

     

$ file / proc / 5602 / fd / 8

     

/ proc / 5602 / fd / 8:破坏管道的符号链接:[6562496]'

我不明白问题的根本原因,我不知道该尝试修复它。

修改

根据@sushihangover的建议,我使用--debug选项在终端中运行了应用程序。最终应用程序再次被绞死。没有例外,没有错误。

代码从MJPEG流中获取帧,并在后台工作器上执行一些工作以检测帧中的对象。

只有在后台工作人员不忙时才会进行工作。我得到的最后一个日志跟踪是:

  

[后台工作人员]无事可做

我怀疑该应用程序在尝试从相机获取下一帧时挂起。我正在使用AForge.NET来读取MJPEG流。每当新画面到达时,AForge都会举起一个事件。

以下是一些代码:

    private static void Camera_NewFrame(object sender, NewImageEventArgs e)
    {
        var bmp = (Bitmap)e.Frame;
        log.DebugFormat("got image " + DateTime.Now.Ticks + " {0} x {1}", bmp.Width, bmp.Height);

        if (!bWorker.IsBusy)
        {
            // Run the background operation to check image and update cloud
            log.Debug("Starting background work");
            bWorker.RunWorkerAsync();
        }
        else { } // skip frame 
    }

    private static void BWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        log.Debug("[Background worker] enter");
        if (registeredCar)
        {
            log.Debug("[Background worker] opening the gate");
            OpenGate();
        }
        else
        {
            log.Debug("[Background worker] nothing to do");
        }
    }

由gdb附加到挂起进程的回溯:

  

(gdb)bt

     poll中的

0 0xb6e19fc0在../ sysdeps / unix / syscall-template.S:81

     

来自/usr/lib/libMonoPosixHelper.so的Mono_Unix_UnixSignal_WaitAny()中的1 0xb4b264be

     

2 0xb4b6f740在? ()

0 个答案:

没有答案