Hi,

Le mer. 26 sept. 2018 à 23:27, Gabriele <phoenix1...@gmail.com> a écrit :
> In trying to find the location of a valid instance of PyInterpreterState in 
> the virtual memory of a running Python (3.6) application (using 
> process_vm_read on Linux),

I understand that you are writing a debugger and you can only *read*
modify, not execute code, right?

> I have noticed that I can only rely on _PyThreadState_Current.interp at the 
> very beginning of the execution. If I try to attach to a running Python 
> process, then _PythreadState_Current.interp doesn't seem to point to anything 
> useful to derive the currently running threads and the frame stacks for each 
> of them.

In the master branch, it's now _PyRuntime.gilstate.tstate_current. If
you run time.sleep(3600) and look into
_PyRuntime.gilstate.tstate_current using gdb, you can a NULL pointer
(tstate_current=0) because Python releases the GIL..

In faulthandler, I call PyGILState_GetThisThreadState() from signal
handlers to get the Python thread state of the current thread... But
this one is implemented using PyThread_tss_get()
(pthread_getspecific() on most platforms). Moreover, it returns NULL
if the current thread is not a Python thread.

There is also _PyGILState_GetInterpreterStateUnsafe() which gives
access to the current Python interpreter:
_PyRuntime.gilstate.autoInterpreterState. From the interpreter, you
can use the linked list of thread states from interp->tstate_head.

I hope that I helped :-)

Obviously, when you access Python internals, the details change at
each Python release... I described the master branch.

Victor
_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to