我写的一个C# winform程序,用来做人脸识别和开门,使用了emgu.cv来抓海康摄像头的RTSP视频流,和虹软的SDK做人脸识别。
程序中用到了多任务,定时触发的程序,http协议实现的客户端注册的回调程序,读取mysql数据库,socket控制开门等等功能。
问题的现象是程序会不定时的崩溃,没有弹出异常的窗口,日志也没记录到任何东西。
照着网上搜到的办法在program.c中增加以下的代码:
//处理未捕获的异常
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
//处理UI线程异常
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
//处理非UI线程异常
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
结果照崩不误。
又仔细的理了下可能出问题的地方,在感觉会出问题的地方加了try catch异常处理,还试了一些其它方法,待后续再补充。
照旧,先记到这里。
继续,看到有人说查windows日志可以找到是哪里出问题的。
依次打开:计算机管理-》系统工具-》事件查看器-》Windows日志-》应用程序,界面如下
有戏!之前用批处理做了程序的崩溃后的自动重启,在重启的时候把时间写到了一个日志文件中。
windows系统记录下的日志很多,用这个时间来查找,果然找到了我的程序的出错信息,加上其它疑似相关的信息,共有.net、应用程序、mysql等9条。
先分析它们。待续。。。
继续
日志中列出的疑似相关记录如下:
信息 2019/4/29 10:53:39 MySQL 100 无
信息 2019/4/29 10:53:39 MySQL 100 无
信息 2019/4/29 10:53:39 Windows Error Reporting 1001 无
错误 2019/4/29 10:53:37 Application Error 1000 (100)
信息 2019/4/29 10:53:37 Windows Error Reporting 1001 无
错误 2019/4/29 10:53:34 Application Error 1000 (100)
错误 2019/4/29 10:53:33 .NET Runtime 1026 无
警告 2019/4/29 10:53:23 User Profile Service 1534 无
警告 2019/4/29 10:53:23 User Profile Service 1534 无
大致分析一下,时间顺序是从下往上。
先排除两条User Profile Service警告,因为详细信息看起来和我的程序无关,其它程序没有崩溃的时候也记录了同样的警告。
.NET Runtime,详细信息中明确说明了是我的程序由于未经处理的异常,进程终止。还记录下了调用栈,非常好,windows大爷就是windows大爷。
再往后四条Application Error 和Windows Error Reporting都是和.NET Runtime相关的。
两条MySQL是报告连接丢失的,应该是进程终止后的连锁反应而不是问题源头。
再找到本程序的其它崩溃时间点的日志看看,呃,有点麻烦啊。
主要有两种,一种是报emgu.cv.videocapture.retrive访问冲突,0xc0000005错误,一种是GDI里面报的0xc0000005,都是访问冲突。这两个报错的点有一个交集就是从视频流里抓到的视频帧的使用,videocapture.retrive负责抓帧,gdi会把包含陌生人的头像显示出来。
搜了一下,在Stackoverflow、github和opencv上都有人说遇到过这种问题,问题的根源在于retrive获取到的帧是和videocapture共享内存的,获取到之后的程序如果要使用,应该clone。
程序改了,明天看效果,之前基本上每天都要崩溃,少则一次,多则五次,如果能三天不崩,问题应该就解决了。
依然照旧啊,我都快崩溃了。
崩溃的时间没有规律,有些甚至是凌晨两点过,那时候肯定是没有人的,看出问题的点,还是在VideoCapture.Retrive()这个函数里。
暂时没招了啊,虽然emgu.cv是开源的,但是没有时间精力去搞啊,先用自动重启批处理顶着。什么时候解决?只有看缘分了。