最新文章專(zhuān)題視頻專(zhuān)題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專(zhuān)題1關(guān)鍵字專(zhuān)題50關(guān)鍵字專(zhuān)題500關(guān)鍵字專(zhuān)題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專(zhuān)題關(guān)鍵字專(zhuān)題tag2tag3文章專(zhuān)題文章專(zhuān)題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專(zhuān)題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentationfault的解決方法

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 14:16:16
文檔

Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentationfault的解決方法

Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentationfault的解決方法:1、sdk返回值不是int型1.1 登錄函數(shù)調(diào)用def login(ip, port, username, password, device_info, error_code):"""LLONG CLIENT_Login(char *pchDVRIP, WORD wDVRPort,char *pchUserName
推薦度:
導(dǎo)讀Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentationfault的解決方法:1、sdk返回值不是int型1.1 登錄函數(shù)調(diào)用def login(ip, port, username, password, device_info, error_code):"""LLONG CLIENT_Login(char *pchDVRIP, WORD wDVRPort,char *pchUserName

1、sdk返回值不是int型

1.1 登錄函數(shù)調(diào)用

def login(ip, port, username, password, device_info, error_code):
"""
LLONG CLIENT_Login(
char *pchDVRIP, WORD wDVRPort,
char *pchUserName, char *pchPassword,
LPNET_DEVICEINFO lpDeviceInfo, int *error = 0);
:param ip:
:param port:
:param username:
:param password:
:param device_info:
:param error_code:
:return: LLONG
"""
ip_buffer = c_buffer(ip)
# ip_buffer.encode('utf8')
# user_id = c_longlong(0)
user_id = SDK._dll.CLIENT_Login(byref(ip_buffer), port, username, password, byref(device_info), byref(error_code))
return user_id # c_longlong(user_id).value

1.2 無(wú)效的ID

用戶(hù)ID作為句柄,傳入其他SDK函數(shù)中,報(bào)錯(cuò),句柄無(wú)效。查看出現(xiàn)負(fù)值。因此懷疑是類(lèi)型不匹配

Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentation fault的解決方法

1.3 設(shè)置返回類(lèi)型

1.3.1 錯(cuò)誤原因

網(wǎng)上查了下,并看了下文檔,python中調(diào)用C的sdk,默認(rèn)返回的是int型,按照l(shuí)ogin C版本的函數(shù)定義,返回的是LLONG型

15.17.1.8. Return types

By default functions are assumed to return the C int type. Other return types can be specified by setting the restype attribute of the function object.

Here is a more advanced example, it uses the strchr function, which expects a string pointer and a char, and returns a pointer to a string:

>>> strchr = libc.strchr
>>> strchr("abcdef", ord("d")) 
8059983
>>> strchr.restype = c_char_p # c_char_p is a pointer to a string
>>> strchr("abcdef", ord("d"))
'def'
>>> print strchr("abcdef", ord("x"))
None
>>>

1.3.2 修改

設(shè)置sdk函數(shù)的返回值為c_longlong,問(wèn)題解決

SDK._dll.CLIENT_Login.restype = c_longlong

2、回調(diào)函數(shù)場(chǎng)景下大概率出現(xiàn)Segmentation fault

網(wǎng)上找了一圈,一般兩種可能性:內(nèi)存越界或者讀寫(xiě)非法; 還有一種就是函數(shù)調(diào)用棧太深。

2.1 讀寫(xiě)加鎖

代碼本身就添加了Condition讀寫(xiě)鎖得,buf也是在寫(xiě)的時(shí)候分配的,多番調(diào)試,應(yīng)該不是這個(gè)地方因?yàn)榈膯?wèn)題。打印日志看,也與讀寫(xiě)操作無(wú)關(guān)。

寫(xiě)

index = userdata # c_uint(userdata).value
_buf_cond.acquire()
# time.sleep(0.2)

# 復(fù)制圖片到內(nèi)存
# _pic_buf.buf = pBuf c_char 和 c_byte轉(zhuǎn)換
try:
 temp = [pBuf[i] for i in xrange(0, RevLen)]
 _buf_list[index].buf = struct.pack('%db' % RevLen, *temp)
 # 序列號(hào)
 _buf_list[index].sn = c_ulong(CmdSerial).value
 _buf_list[index].id = index
 _buf_list[index].size = c_uint(RevLen).value
 _buf_list[index].ext = 'jpeg' # encode_dict.get(EncodeType, 'jpeg')
except Exception, e:
 logger.error('截圖緩存發(fā)生異常:%s' % str(e))
finally:
 _buf_cond.notify()
 _buf_cond.release()
_buf_cond.acquire()
_buf_cond.wait(timeout=15.0)
# 等待200ms再訪(fǎng)問(wèn)數(shù)據(jù)
# time.sleep(0.2)
if _buf_list[self.index].sn == snap.CmdSerial and _buf_list[self.index].id == self.index:
 self.save_picture(_buf_list[self.index].buf, _buf_list[self.index].ext)
 self.info('針對(duì)通道%d截圖成功,IP:%s,Port:%s' % (channel, self.ip, self.port))
 pass
_buf_cond.release()

2.2 減少棧調(diào)用層次

由于引入這個(gè)sdk之后,使用了回調(diào)函數(shù)。因此將回調(diào)函數(shù)定義層次減少。

2.2.1 修改前

傳入函數(shù)給基類(lèi),在基類(lèi)中CFUNCTYPE實(shí)例化函數(shù)

基類(lèi)中定義

self.callback = CFUNCTYPE(c_void_p, c_longlong, POINTER(c_byte), c_uint, c_uint, c_ulong, c_ulonglong)
def set_callback(self, save_after_recv_pic, index):
 self.dll.CLIENT_SetSnapRevCallBack(self._callback(save_after_recv_pic), index)
子類(lèi)中定義,_save_after_recv_pic也在子類(lèi)中定義為staticmethod
def _set_callback(self):
 try:
 if 0 <= self.index < _buf_size:
 self.set_callback(self._save_after_recv_pic, self.index) # 函數(shù)調(diào)用層次太深,經(jīng)常報(bào)segmentation fault
 return True
 else:
 self.error('設(shè)置截圖保存回調(diào)函數(shù)的userdata參數(shù)錯(cuò)誤:%d' % self.index)
 return False
 except Exception, e:
 self.error('設(shè)置截圖保存回調(diào)函數(shù)失敗,%s' % str(e))
 return False
 

2.2.2 修改后問(wèn)題解決

子類(lèi)中直接實(shí)例化回調(diào)函數(shù)

self.capture_callback = self.callback(self._save_after_recv_pic)
子類(lèi)中直接注冊(cè)回調(diào)函數(shù)
def _set_callback(self):
 try:
 if 0 <= self.index < _buf_size:
 self.dll.CLIENT_SetSnapRevCallBack(self.capture_callback, self.index)
 # self.set_callback(self._save_after_recv_pic, self.index) # 函數(shù)調(diào)用層次太深,經(jīng)常報(bào)segmentation fault
 return True
 else:
 self.error('設(shè)置截圖保存回調(diào)函數(shù)的userdata參數(shù)錯(cuò)誤:%d' % self.index)
 return False
 except Exception, e:
 self.error('設(shè)置截圖保存回調(diào)函數(shù)失敗,%s' % str(e))
 return False

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentationfault的解決方法

Python調(diào)用C的SDK出現(xiàn)返回值不符合預(yù)期以及Segmentationfault的解決方法:1、sdk返回值不是int型1.1 登錄函數(shù)調(diào)用def login(ip, port, username, password, device_info, error_code):"""LLONG CLIENT_Login(char *pchDVRIP, WORD wDVRPort,char *pchUserName
推薦度:
標(biāo)簽: 出現(xiàn) 解決 python
  • 熱門(mén)焦點(diǎn)

最新推薦

猜你喜歡

熱門(mén)推薦

專(zhuān)題
Top