我得到一個C庫,需要一些回調, 他們在一個鏈表中處理。ctypes回調函數拋出SIGSEGV
蟒蛇調用的是那些:
def callback_exit():
print("exiting.")
sys.exit(0)
# never reached
return c_int(0)
def hw_print_int():
print("foo")
return c_int(0)
我將它們添加到列表中是這樣的:
SFR_COMM=CFUNCTYPE(c_voidp)
class MyClass:
def add_SFR_callback(self,operation_number,callback):
all_callbacks=c_voidp.in_dll(self.memlib,"sfr_comms")
my_callback=self.memlib.newSFRCommand(c_uint(operation_number),callback)
new_all_callbacks=self.memlib.new_SFRCommandHolder(my_callback,all_callbacks)
self.memlib.set_sfr_comms(new_all_callbacks)
my_class_object.add_SFR_callback(0xff,SFR_COMM(callback_exit))
my_class_object.add_SFR_callback(0xff,SFR_COMM(hw_print_int))
這工作得很好,直到回調被調用,那麼我只收到一個SIGSEGV。
重要:在SIGSEGV告訴我,這是一個「UngültigerMaschinenbefehl」(中譯:無效處理器指令或類似的東西)
所以我不知道我該如何解決它。
這是C代碼:
struct _SFRCommandHolder * sfr_comms;
#define DEBUG
unsigned int SpecialFunctionRegister_exec(unsigned int val)
{
struct _SFRCommandHolder * curr=sfr_comms;
unsigned int ret=-1;
while (curr!=NULL)
{
#ifdef DEBUG
printf("(%zd => %zd => %zd) %u ?= %u",curr,curr->com,curr->com->funct,curr->com->val,val);
#endif
if(curr->com->val==val)
{
#ifdef DEBUG
printf("\t\tTRUE\n");
#endif
ret=curr->com->funct(); // <= SIGSEGV here
#ifdef DEBUG
printf("callback done.\n");
#endif
}
#ifdef DEBUG
else
{
printf("\t\tFALSE\n");
}
#endif
curr=curr->next;
}
return ret;
}
我不認爲,這是sys.exit
一個問題,因爲它之前就好工作了幾提交。
編輯: 調用hw_print_int
作品就好了,但callback_exit
不起作用。
順便說一句:如果我不加hw_print_int
,callback_exit
作品,也
輸出:
(13185760 => 13136448 => 139994994819144) 3 ?= 255 FALSE
(13038864 => 13034576 => 139994994819088) 255 ?= 255 TRUE
Ungültiger Maschinenbefehl (Speicherabzug geschrieben)
嘗試初始化sfr_comms爲NULL。 – cup
@cup不是問題。我的記憶處理是有效的。 (我測試過) – LittleByBlue