
Pyrasite: Tools for injecting code into running Python processes - tombenner
http://pyrasite.com/
======
mau
I had some "memory leak" issues a few months ago with the api hosts of the
service I'm working on. As the code changes made during the days before didn't
seem to have affected anything that could be related to this leak I realized
it was something about the requests we were receiving but I wasn't able to
replicate the same issues in my dev host nor in staging. Eventually I dumped
the memory of a running process using Pyrasite and after hacking a little bit
with meliae ([https://launchpad.net/meliae](https://launchpad.net/meliae)) I
was able to find the issue and solve it.

Very useful.

By the way is worth noticing that you won't probably be able to attach the
interactive console to a running web server as the output is usually handled
by the supervisor process, at least I wasn't able to do that in my first
tentative and the memory dump was good enough for me.

Check this sample to dump the memory out of a running process:
[http://pyrasite.readthedocs.org/en/latest/Payloads.html#dump...](http://pyrasite.readthedocs.org/en/latest/Payloads.html#dumping-
out-object-memory-usage-statistics)

------
klibertp
Wow, live inspection of running code without prior instrumentation is a great
feature of Erlang which I always missed in Python. I used `rconsole` from rfoo
package ([https://code.google.com/p/rfoo/](https://code.google.com/p/rfoo/))
before, but this looks like a cleaner solution because you don't have to
include server spawning code in the code you want to inspect. Very nice.

------
AnkhMorporkian
I've used this a few times to debug running processes that were having small
issues that weren't bad enough to restart the system to put in a proper
manhole, but bad enough to be affecting users. Worked perfectly to figure out
what was going on, and to patch the naughty method.

It's one of those tools that you'll be glad exists when the need arises, but
you'll feel a little dirty using it.

~~~
tenfingers
Why "dirty"? Attaching and inspecting a live process without cooperation is
something that should be _expected_.

pdb is quite limited in what it can debug if you have a stuck process which is
very hard to reproduce. I've resorted to gdb + python extensions too many
times to count (which basically allows you do what pyrasite does, though at a
lower level).

------
tbarbugli
Would be nice to know how this actually works; docs dont say much about how
the tool injects the code into the running process.

~~~
matthewmacleod
It basically uses GDB to call eval inside a running Python VM. Pretty simple,
but quite useful from time to time.

~~~
BozeWolf
But how does it get into that running Python VM?

~~~
coolj
GDB uses a system call(s) to attach to the running process[1], and python
exposes an API that lets you evaluate code in the current VM context[2].
Specifically,
[https://github.com/lmacken/pyrasite/blob/develop/pyrasite/in...](https://github.com/lmacken/pyrasite/blob/develop/pyrasite/injector.py#L22-42)

[1] [http://aosabook.org/en/gdb.html](http://aosabook.org/en/gdb.html) [2]
[https://docs.python.org/2/c-api/veryhigh.html](https://docs.python.org/2/c-api/veryhigh.html)

~~~
BozeWolf
Excellent answer to my question. Thanks!

