summaryrefslogtreecommitdiffstats
path: root/src/lib/Server/Plugins/Guppy.py
blob: b217378d66ab7c67cc96e04e7a189ec1dea160e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
"""
This plugin is used to trace memory leaks within the bcfg2-server
process using Guppy.  By default the remote debugger is started
when this plugin is enabled.  The debugger can be shutoff in a running
process using "bcfg2-admin xcmd Guppy.Disable" and reenabled using
"bcfg2-admin xcmd Guppy.Enable".

To attach the console run:

python -c "from guppy import hpy;hpy().monitor()"

For example:

# python -c "from guppy import hpy;hpy().monitor()"
<Monitor> 
*** Connection 1 opened ***
<Monitor> lc
CID PID   ARGV
  1 25063 ['/usr/sbin/bcfg2-server', '-D', '/var/run/bcfg2-server.pid']
<Monitor> sc 1
Remote connection 1. To return to Monitor, type <Ctrl-C> or .<RETURN>
<Annex> int
Remote interactive console. To return to Annex, type '-'.
>>> hp.heap() 
...


"""
import re
import Bcfg2.Server.Plugin

class Guppy(Bcfg2.Server.Plugin.Plugin):
    """Guppy is a debugging plugin to help trace memory leaks"""
    name = 'Guppy'
    __version__ = '$Id$'
    __author__ = 'bcfg-dev@mcs.anl.gov'

    experimental = True
    __rmi__ = Bcfg2.Server.Plugin.Plugin.__rmi__ + ['Enable','Disable']

    def __init__(self, core, datastore):
        Bcfg2.Server.Plugin.Plugin.__init__(self, core, datastore)

        self.Enable()

    def Enable(self):
        """Enable remote debugging"""
        try:
            from guppy.heapy import Remote
            Remote.on()
        except:
            self.logger.error("Failed to create Heapy context")
            raise Bcfg2.Server.Plugin.PluginInitError

    def Disable(self):
        """Disable remote debugging"""
        try:
            from guppy.heapy import Remote
            Remote.off()
        except:
            self.logger.error("Failed to disable Heapy")
            raise Bcfg2.Server.Plugin.PluginInitError