我试图通过Cython中的LD_PRELOAD拦截调用时遇到分段违规。 我不明白为什么呢?

"""An experiment in shimming from Cython / Python."""

cdef extern from "dlfcn.h":
    void* dlsym(void*, char*)
    void* RTLD_NEXT

cdef extern int execvp(const char *file, char *const argv[]) with gil:
    print "Intercepted lookup of %r" % file
    libc_execvp = dlsym(RTLD_NEXT, "execvp")
    if libc_execvp:
        with nogil:
            return (<int(*)(const char*, char * const *) nogil>libc_execvp)(file, argv)
    return -1

有一个示例测试用例的项目可以在https://github.com/CraigJPerry/pyshim/blob/master/pyshim/pyshim.pyx上找到。

我相信python运行时可能没有正确初始化,这是我的问题的根源?

[craig@d1 pyshim](master)$ gdb env
..
Reading symbols from /usr/bin/env...Reading symbols from /usr/bin/env...(no debugging symbols found)...done.
(gdb) set environment LD_PRELOAD=pyshim/pyshim.so
(gdb) set args echo
(gdb) run
Starting program: /usr/bin/env echo
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x000000396ee0ddb0 in sem_wait () from /lib64/libpthread.so.0
(gdb) bt
#0  0x000000396ee0ddb0 in sem_wait () from /lib64/libpthread.so.0
#1  0x0000003bbcf0c7b5 in PyThread_acquire_lock ()
   from /lib64/libpython2.7.so.1.0
#2  0x0000003bbcefad80 in ?? () from /lib64/libpython2.7.so.1.0
#3  0x0000003bbcefb62c in PyGILState_Ensure () from /lib64/libpython2.7.so.1.0
#4  0x00007ffff7df9519 in execvp (__pyx_v_file=0x7fffffffe85b "echo", 
    __pyx_v_argv=0x7fffffffe4d0) at pyshim/pyshim.c:681
#5  0x0000000000401a82 in main ()

===============>>#1 票数:2 已采纳

Cython假设您正在运行一个功能性Python解释器(即您正在编写扩展模块 )。 在这种情况下,您嵌入 Python而不是扩展它。 所以你需要做一些额外的工作来初始化一切。

幸运的是,这不是一个具有挑战性的问题:

"""An experiment in shimming from Cython / Python."""

cdef extern from "dlfcn.h":
    void* dlsym(void*, char*)
    void* RTLD_NEXT

cdef extern from "Python.h":
    void Py_Initialize() nogil

cdef extern void initpyshim()

cdef extern int execvp(const char *file, char *const argv[]) nogil: # note nogil here
    Py_Initialize() # initialize Python
    with gil:
        initpyshim() # initialize containing module
        print "Intercepted lookup of %r" % file
        libc_execvp = dlsym(RTLD_NEXT, "execvp")
        if libc_execvp:
            with nogil:
                return (<int(*)(const char*, char * const *) nogil>libc_execvp)(file, argv)
        return -1

如果您的函数可能被多次调用,您可能希望避免重新初始化模块(您可以通过检查Py_IsInitialized()来完成此操作)。 您可能还需要在离开方法之前调用Py_Finalize()

如果您的目标是Python 3,则init方法称为PyInit_<modname>并返回一个PyObject *引用,您需要保留该引用直到方法结束(至少)。

  ask by CraigJPerry translate from so

未解决问题?本站智能推荐:

2回复

Cython - gil相关问题

我有以下代码,我正在尝试并行化。 以下给出描述 上面代码的描述: 函数sma_vec , wma_vec ,计算x一些度量并返回y的输出(在此示例中,滚动移动平均值和滚动加权移动平均值)。 功能stat_switch开关要么sma_vec或wma_vec取决于的值st
2回复

没有GIL的cython memoryviews切片

我想释放GIL,以并行化cython中的循环,在该循环中,不同的memoryviews片段将传递给循环内的某个函数。 代码如下: 这是不可能的,因为选择切片x [d ,:]似乎需要GIL。 运行cython -a ,并使用普通的for循环,我得到下面的代码。 用纯C语言怎么做?
2回复

Cython:如何在没有GIL的情况下打印

如何在没有gil的Cython函数中使用print ? 例如: 编译时出现此错误: 我知道如何使用C库而不是他们的python等价物(例如这里的math库),但我找不到类似的print 。
3回复

Cython在没有gil的numpy数组列表上进行迭代

我想遍历具有不同维数的numpy数组的列表,并将它们传递给不需要GIL的cython函数: 编译Cython代码时,出现以下错误: 是否可以使用其他类型的数据结构代替Python列表来存储这些numpy数组,以便无需gil即可遍历它们? 我愿意接受涉及malloc C指针/ C
1回复

Cython并行读取文件并绕过GIL

试图弄清楚如何使用Cython绕过GIL并并行加载文件以执行IO绑定任务。 现在,我有以下Cython代码尝试加载文件n0.npy,n1.py ... n100.npy 我没有注意到明显的提速-有人对此有任何经验吗? 编辑:我得到900毫秒并行与1.3秒串行。 给定8个线程,预
1回复

带有Openmp的Cython numpy数组(无GIL)

我不确定以前是否已解决此问题,我尝试搜索但未找到我一直在寻找的东西。 我想使以下代码正常工作(文件名为some_CD.pyx) 我的setup.py如下所示 我不确定这段代码中有很多东西。 首先,我是否以正确的方式使用numpy数组? 是否在prange中使用float64
1回复

Cython函数返回没有GIL错误的指针

我不明白为什么这不能编译。 _svd返回double *,我将其分配给double *。 错误信息:没有GIL不允许来自Python的强制转换 编辑:它与GIL,但我想不使用GIL调用它。
1回复

Cython不要求gil哪些C函数?

我尝试编译以下Cython代码,该代码使用C函数进行文件操作: 但是,出现以下错误: 我认为只有python函数需要gil,而没有导入的C函数。 然而,似乎并非如此。 因此,我的问题是: 在不使用GIL Cython可以使用哪些C函数? 如何不使用GIL
1回复

在Cython中使用自定义Python对象发布GIL?

我正在尝试多线程一些工作代码。 多重处理占用太多内存,因为数据集在每个过程中都不共享,而是为每个过程克隆。 也就是说,我有100/100/100/100,而不是4个进程的25/25/25/25。 由于Python使用了Global Interpreter Lock,因此多线程同时运行,并且一切都比
1回复

释放Cython中GIL的危险? [关闭]

如果我选择在Cython脚本中发布GIL,我需要考虑什么? 在Cython程序中释放GIL是否有其他危险或风险? 另外,如何指定要产生的线程数?