मैं अपने लाइब्रेरी के लिनक्स पोर्ट से लिंक करने के लिए विंडोज-विशिष्ट प्रोग्राम से कुछ पायथन ctypes
कोड पोर्ट करने का प्रयास कर रहा हूं। मेरी समस्या का वर्णन करने वाला सबसे छोटा पायथन कोड नमूना नीचे दिखाया गया है। जब मैं इसे निष्पादित करने का प्रयास करता हूं, तो मुझे पायथन में examine_arguments()
में सेगमेंटेशन गलती मिलती है। मैंने क्रैशिंग फ़ंक्शन कॉल पर अपनी लाइब्रेरी में printf
कथन रखा है, लेकिन इसे कभी निष्पादित नहीं किया जाता है, जिससे मुझे लगता है कि समस्या ctypes कोड में है।पाइथन सीटीपीएस सेगमेंटेशन गलती डीबगिंग
import ctypes
avidll = ctypes.CDLL("libavxsynth.so")
class AVS_Value(ctypes.Structure, object):
def __init__(self, val=None):
self.type=ctypes.c_short(105) # 'i'
self.array_size = 5
self.d.i = 99
class U(ctypes.Union):
_fields_ = [("c", ctypes.c_void_p),
("b", ctypes.c_long),
("i", ctypes.c_int),
("f", ctypes.c_float),
("s", ctypes.c_char_p),
("a", ctypes.POINTER(AVS_Value))]
AVS_Value._fields_ = [("type", ctypes.c_short),
("array_size", ctypes.c_short),
("d", U)]
avs_create_script_environment = avidll.avs_create_script_environment
avs_create_script_environment.restype = ctypes.c_void_p
avs_create_script_environment.argtypes = [ctypes.c_int]
avs_set_var = avidll.avs_set_var
avs_set_var.restype = ctypes.c_int
avs_set_var.argtypes = [ctypes.c_void_p, ctypes.c_char_p, AVS_Value]
env = avs_create_script_environment(2)
val = AVS_Value()
res = avs_set_var(env, b'test', val)
मेरे पुस्तकालय इसके शीर्षकों में निम्नलिखित, और एक सादा-सी कार्यक्रम कर रही है क्या मैं ऊपर का वर्णन (create_script_environment
set_var
के बाद बुला) ठीक चलाता है। लॉगिंग जानकारी को देखते हुए मेरी लाइब्रेरी कंसोल पर डाल रही है, क्रैश तब होता है जब मैं avs_set_var
दर्ज करने का प्रयास करता हूं।
typedef struct AVS_ScriptEnvironment AVS_ScriptEnvironment;
typedef struct AVS_Value AVS_Value;
struct AVS_Value {
short type; // 'a'rray, 'c'lip, 'b'ool, 'i'nt, 'f'loat, 's'tring, 'v'oid, or 'l'ong
// for some function e'rror
short array_size;
union {
void * clip; // do not use directly, use avs_take_clip
char boolean;
int integer;
float floating_pt;
const char * string;
const AVS_Value * array;
} d;
};
AVS_ScriptEnvironment * avs_create_script_environment(int version);
int avs_set_var(AVS_ScriptEnvironment *, const char* name, AVS_Value val);
मैं GDB से कॉल backtracing कोशिश की, लेकिन मुझे समझ नहीं आता परिणामों की व्याख्या है और न ही वास्तव में बहुत GDB का उपयोग कर के बारे में करने के लिए कैसे।
#0 0x00007ffff61d6490 in examine_argument() from /usr/lib/python2.7/lib-dynload/_ctypes.so
#1 0x00007ffff61d65ba in ffi_prep_cif_machdep() from /usr/lib/python2.7/lib-dynload/_ctypes.so
#2 0x00007ffff61d3447 in ffi_prep_cif() from /usr/lib/python2.7/lib-dynload/_ctypes.so
#3 0x00007ffff61c7275 in _ctypes_callproc() from /usr/lib/python2.7/lib-dynload/_ctypes.so
#4 0x00007ffff61c7aa2 in PyCFuncPtr_call.2798() from /usr/lib/python2.7/lib-dynload/_ctypes.so
#5 0x00000000004c7c76 in PyObject_Call()
#6 0x000000000042aa4a in PyEval_EvalFrameEx()
#7 0x00000000004317f2 in PyEval_EvalCodeEx()
#8 0x000000000054b171 in PyRun_FileExFlags()
#9 0x000000000054b7d8 in PyRun_SimpleFileExFlags()
#10 0x000000000054c5d6 in Py_Main()
#11 0x00007ffff68e576d in __libc_start_main() from /lib/x86_64-linux-gnu/libc.so.6
#12 0x000000000041b931 in _start()
मुझे इस समस्या से संपर्क करने के तरीके के नुकसान में है। मैंने कॉलिंग प्रकारों के ब्योरे को देखा है, लेकिन मुझे वहां कुछ भी गलत नहीं दिख रहा है। क्या मैं किसी भी मंच-विशिष्ट उपयोगों में गिर रहा हूं?
संपादित करें ऐसा लगता है कि ctypes मॉड्यूल में 32-बिट बनाम 64-बिट आर्किटेक्चर के साथ कोई समस्या है। जब मैंने अपनी लाइब्रेरी और 32-बिट पायथन के 32-बिट निर्माण के साथ फिर से इसका परीक्षण किया, तो यह सफलतापूर्वक भाग गया। 64-बिट पर, यह एक ही स्थान पर segfaults।
मैं इस कोड संकलित की नकल की, स्पष्ट रूप से गलत चिपकाया बिट्स पुन: व्यवस्थित, दो कार्यों में से कुछ डमी कार्यान्वयन बनाया है, यह x86_64 के लिए है, और इसे 64-बिट पायथन 2.7 (उबंटू नट्टी, जीसीसी 4.5.2, पायथन 2.7.1, एग्लिब 2.13) के तहत चलाया गया है, और सबकुछ अपेक्षित के रूप में काम करता है। यहां ctypes पर समस्या को दोषी ठहराते हुए लगता है; शायद आप एक और पूर्ण तोड़ने का उदाहरण प्रदान कर सकते हैं? –
मैंने कोड उदाहरण साफ़ किया। ऐसा लगता है कि segfault संघ से संबंधित है AVS_Value वर्ग का हिस्सा है। जब मैं इसे ctypes.c_int या ctypes.c_void_p जैसे किसी चीज़ से प्रतिस्थापित करता हूं, तो प्रोग्राम अब segfaults नहीं है। मुझे लगता है कि यह मुद्दा उबंटू पर स्थापित पायथन के साथ है, लेकिन मैं उबंटू 12.04, जीसीसी 4.6.3, पायथन 2.7 .. – user1505563