It probably should have been called pydbgattach or so but I didn't noticed until I went to bed so I keep this name now. :)
This works in several steps:
We are attaching to the running Python process and want to inject some C-code
Originally I planned to develop a small tool for this by myself based on
ptrace. For Mac, I also found
mach_injectwhich may have been useful.
However, to keep things simple for now, I just use GDB for this.
See the file
pydbattach.shwhich basically does this step.
pyinjectcode.ccreates a new Python thread and runs a Python script. In our case, it runs
pyinjectcode.pystarts a Pdb instance and attaches it to another already running Python process (just the first it founds for now). This is done via a more generic
sys.settracefunction which is implemented in
(_)ctypesto access the underlying CPython objects for the thread state. This way, it reimplements
PyEval_SetTracein a more general way.
-- Albert Zeyer, http://www.az2000.de