我在使用 Python C API 时遇到了一个非常奇怪的问题。我有一个全局范围的结构 'dcon',其中包含一个 PyObject 'device' 成员。
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)
)。这是遇到段错误时的回溯:
(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
我对 Python C API 有点陌生。我最初的想法是我在引用计数方面做错了,但我似乎无法理解它。