我遇到了Python C API的一個非常奇怪的問題。我有一個全局範圍的結構'dcon',它包含一個PyObject的'設備'成員。PyObject_HasAttrString段錯誤當屬性不存在時,不存在時
static status_t get_mac_addr(uint8_t const ** addr,
size_t * const size){
static uint8_t device_mac_addr[6] = {0};
*addr = device_mac_addr;
*size = sizeof device_mac_addr;
if(PyObject_HasAttrString(dcon.device, "mac_address") == 1){
...
}
return 0;
}
看來只要'mac_address'屬性存在,代碼就會執行得很好。奇怪的是,當'mac_address'不是一個定義的屬性時,我遇到了一個segault(Segmentation fault (core dumped)
)。下面是遇到段錯誤時,回溯:我有點使用Python C API是新手的
(gdb) bt
#0 0x00000000004ca607 in PyErr_Restore()
#1 0x00000000004aa29f in PyErr_Format()
#2 0x000000000049e6ee in _PyObject_GenericGetAttrWithDict()
#3 0x0000000000486387 in PyObject_GetAttrString()
#4 0x00000000004ea7d7 in PyObject_HasAttrString()
#5 0x00007ffff4f2056d in get_mac_addr (size=0x7ffff4f1cd28, addr=<optimized out>) at config.c:165
。我最初的想法是,我在引用計數方面做了一些錯誤的工作,但似乎無法繞過它。
很難說沒有更多的代碼。發佈GIL可能是其中一個原因。如果是這種情況,您需要在使用Python API的代碼周圍調用PyGILState_Ensure()和PyGILState_Release()。 – yak
@yak啊,我簡直不敢相信這一切都不會發生在我身上。我有2個線程,現在我想到了,這不會引起問題。我只需要添加: 'PyGILState_STATE gstate;在我調用PyObject_HasAttrString()之前釋放它之前,gstate = PyGILState_Ensure(); 。感謝您的幫助,如果您添加答案,我會將其標記爲已解決:) – weak
很高興我能提供幫助。我添加了一個答案。 – yak