1. 程式人生 > 其它 >EasyCVR呼叫封裝SDK崩潰報錯runtime error排查及修改

EasyCVR呼叫封裝SDK崩潰報錯runtime error排查及修改

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;

}