Gevent后门检查运行代码

2024-05-15 02:58:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用gevent及其Backdoor功能。在

这是我的代码的简化版本:

from gevent import backdoor, event

class App(object):
    def __init__(self):
        self.stop_event = event.Event()
        self.servers = []
        self.servers.append(backdoor.BackdoorServer((localhost, 6666))
        # There is a tcp stream server using gevent configured too

    def start(self):
        for server in self.servers:
            if not server.started:
                server.start()
        self.stop_event.wait()
        for server in self.servers:
            if server.started:
                server.stop()


def run(*args, **kw):
    app = App()
    app.start()

在我的run中,从entry_points创建的run方法被调用

我想用我的后门来检查app函数中的app变量local。在

我连接到后门,并运行命令inspect.stack()。我得到的是:

^{pr2}$

如您所见,gevent似乎正在重写堆栈。启动程序的模块中的run函数不在其中。它在执行后门的greenlet的run方法处停止。在

是否有任何方法可以访问已启动程序的正在运行的run方法来检查它并访问其本地app变量?在


Tags: 方法runselfeventappforserverdef
1条回答
网友
1楼 · 发布于 2024-05-15 02:58:06

好吧,我找到了解决办法。greenlet对象有一个parent属性,用于查找哪个属性生成了您当前正在查看的对象。然后greenlet有一个属性gr_frame来存储stacktrace。在

因此,在我的情况下,一旦我连接到后门服务器,它将是这样的:

>>> import greenlet, inspect
>>> greenlet.getcurrent()
<SocketConsole at 0x7fca7122d190>

>>> greenlet.getcurrent().parent
<Hub at 0x7fca71560050 epoll default pending=0 ref=4 fileno=3 resolver=<gevent.resolver_thread.Resolver at 0x7fca7126a510 pool=<ThreadPool at 0x7fca7127fe10 0/1/10>> threadpool=<ThreadPool at 0x7fca7127fe10 0/1/10>>

>>> greenlet.getcurrent().parent.parent
<greenlet.greenlet object at 0x7fca7d9be690>

>>> inspect.getouterframes(greenlet.getcurrent().parent.parent.gr_frame)
[
...
(<frame object at 0x174ac40>, 'path_to_project/endpoints/app.py', 238, 'run', ['        app.start()\n'], 0),
...
]

>>> inspect.getouterframes(greenlet.getcurrent().parent.parent.gr_frame)[4][0]
<frame object at 0x174ac40>

>>> inspect.getargvalues(inspect.getouterframes(greenlet.getcurrent().parent.parent.gr_frame)[4][0]).locals 
{'args': [], 'app': <endpoints.app.App object at 0x7fca71360190>, 'kw': {}}

>>> inspect.getargvalues(inspect.getouterframes(greenlet.getcurrent().parent.parent.gr_frame)[4][0]).locals['app']
<endpoints.app.App object at 0x7fca71360190>

我无法访问正在运行的函数run中的本地对象app,以检查其其他属性的值并调试我的实时gevent应用程序。在

相关问题 更多 >

    热门问题