cython分段故障处理

我正在包装一些C库,我有一个function,在某些情况下可能导致分段错误。 在这种情况下,我需要调用第二个函数,在这种情况下将成功完成。

有谁知道如何处理cython中的分段错误?

一个可能有用的简短示例(使用signal ):

example.h (假设Cython扩展名为myext.pyx

 // Header autogenerated by Cython when declaring "public api" functions #include "../myext_api.h" void handleFuncFailure(char *func1_name, char *func2_name); void generateSegFault(); 

example.c

 #include  #include  static char *func2name; static void handler2(int sig) { // Catch exceptions switch(sig) { case SIGSEGV: fputs("Caught SIGSEGV: segfault !!\n", stderr); break; } int error; // "call_a_cy_func()" is provided by "myext.pyx" call_a_cy_func(func2name, &error); exit(sig); } void handleFuncFailure(char *func1_name, char *func2_name) { // Provided by autogenerated "myext_api.h" header import_myext(); func2name = func2_name; signal(SIGSEGV, handler2); int error; // "call_a_cy_func()" is provided by "myext.pyx" call_a_cy_func(func1_name, &error); } void generateSegFault() { *(int*) 0 = 0; } 

myext.pyx

 # Helper function to call a function by its name # "public api" enables to call this function from C side (See above) cdef public api void call_a_cy_func(char* method, bint *error): if (method in globals()): error[0] = 0 globals()[method](); else: error[0] = 1 # Expose C functions cdef extern from "src/example.h": void handleFuncFailure(char *func1_name, char *func2_name) void generateSegFault() # The unreliable function def func1(): print "hello1 ! Generating segfault..." generateSegFault() # The reliable function def func2(): print "hello2 ! Running safe code..." # To be called from the Cython extension inner code cdef myHandleFuncFailure(f1, f2): handleFuncFailure(f1, f2) # To be called from Python source by importing "myext" module def myHandleFuncFailure2(): myHandleFuncFailure("func1", "func2") 

输出继电器

你好1! 生成段错误……

抓到SIGSEGV:段错!!

你好2! 运行安全代码……

我希望这能给出一些想法,至少……