Re: Segmentation Fault on CDLL reloading



Marcus.CM schrieb:
Hi,

I use the following ctype to load a .so library in Linux.

vr = ctypes.CDLL(sstr) And the following to release it so that i can reload the library without quiting the python script.

_ctypes.dlclose(vr._handle)

These calls are guarded by a writer lock and access to it guarded by a reader lock which i got from recipe :

The problem is during the re-loading of the library occasionally the python script will abort with "Segmentation Fault". This is like 1 out of 10 times it can happen and that
is good enough to kill the application.

Is there any reason to this or how to do i prevent it?

Short answer: yes, there is a reason, no, you can't prevent it.

Of course there is a reason for this. Segfaults don't happen by chance... And one can't prevent segfaults from killing the interpreter, because the OS is responsible for that.

Now what would I do?

- don't care. Or does the DLL frequently change when the program is deployed? Or to ask different: why do you need unloading/reloading at all?

- debug it. Write a script that exposes the behavior. The fire up GDB with python, do "set args <myscript>" and run. When the segfault occurs, look into the traceback with "bt". If the problem is in the DLL-code, see what's causing it. If it's in ctypes (or the python-interpreter) - well, there is a ctypes mailing lisk to ask for help.

Diez
.



Relevant Pages

  • Re: ctypes 0.9.2 released
    ... >>enhancements, and ctypes would be a huge enhancement to Python's stdlib. ... because it's really not that easy to cause segfaults ... Or is Guido a regular ctypes user (and presumably one ...
    (comp.lang.python)
  • Re: ctypes 0.9.2 released
    ... >> enhancements, and ctypes would be a huge enhancement to Python's stdlib. ... Just> make is easy to cause segfaults. ... integrating Python with the environment. ...
    (comp.lang.python)
  • ctypes, arrays and pointers
    ... Does anyone know how to do the equivalent of this using ctypes? ... segfaults. ... FWIW, I also tried: ... but you can't add an int to a c_char_Array_2415600. ...
    (comp.lang.python)