EasyCVR作为TSINGSEE青犀视频开发的视频协议融合平台,除了可以接入RTSP、GB28181外,还通过HIKSDK、Ehome等私有协议完成与设备的对接和视频流的传输。
客户服务器部署EasyCVR项目,在运行一段时间后出现了崩溃问题。打开log日志,错误信息如下图:“runtime error: invalid memory address or nil pointer dereference”。
这种错误是典型的go指针声明后,没有对指针进行初始化而直接使用导致的错误。错误信息查看代码第516行AddStream函数,下面代码是表示这个函数是错误的关键,并保存成错误文件信息,所以此处不是错误的关键。
在次查看错误信息第代码606行:
第606行代码参数代表:通道名称、流地址、通道id、使用sdk的句柄、channelNum和流类型这几个参数。所以与前面报错信息会联想到肯定是调用SDK的句柄的问题。随后查看本地的.DB的数据库进行对比:
字段dahua_device_handle其中有0和-1这二个值。所有有这二个值是登录失败或者错误的时候才有。而程序直接使用了此值。这样会导致调用.dll和.so崩溃的问题。
调用SDK之前,传入句柄的时候进行判断如下:
If loginHandle <=0 {
Return -1, fmt.Errorf(“handle param error:%d”, loginHandle)
}
或者直接在封装的DLL也进行if判断,这样做是为了双重保险。
if (loginHandle <= 0) {
return -1;
}