EasyCVR调用封装SDK崩溃报错runtime error排查及修改

EasyCVR作为TSINGSEE青犀视频开发的视频协议融合平台,除了可以接入RTSP、GB28181外,还通过HIKSDK、Ehome等私有协议完成与设备的对接和视频流的传输。

客户服务器部署EasyCVR项目,在运行一段时间后出现了崩溃问题。打开log日志,错误信息如下图:“runtime error: invalid memory address or nil pointer dereference”。

EasyCVR调用封装SDK崩溃报错runtime error排查及修改

这种错误是典型的go指针声明后,没有对指针进行初始化而直接使用导致的错误。错误信息查看代码第516行AddStream函数,下面代码是表示这个函数是错误的关键,并保存成错误文件信息,所以此处不是错误的关键。

EasyCVR调用封装SDK崩溃报错runtime error排查及修改

在次查看错误信息第代码606行:

EasyCVR调用封装SDK崩溃报错runtime error排查及修改

第606行代码参数代表:通道名称、流地址、通道id、使用sdk的句柄、channelNum和流类型这几个参数。所以与前面报错信息会联想到肯定是调用SDK的句柄的问题。随后查看本地的.DB的数据库进行对比:

EasyCVR调用封装SDK崩溃报错runtime error排查及修改

字段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;

}

EasyCVR调用封装SDK崩溃报错runtime error排查及修改

 

上一篇:iOS编译SDK自动化脚本(.framework+.a)


下一篇:appium:appium上手