2016-09-06 2 views
0

Backdoor 기능이있는 gevent을 사용하고 있습니다.Gevent 백도어 runing 코드 검사

이 내 코드의 단순화 된 버전입니다 :

run 방법에 entry_points에서 만든 console_scripts에라고
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() 

setup.py 나는 app 변수를 검사하는 내 백도어를 사용하려면

로컬 내 run 기능.

백도어에 연결하고 inspect.stack() 명령을 실행하십시오. 이것이 내가 얻는 것입니다 :

[ 
(<frame object at 0x7fa49ea0b3a0>, '<console>', 1, '<module>', None, None), 
(<frame object at 0x7fa49ce727f0>, '/usr/lib/python2.7/code.py', 103, 'runcode', ['   exec code in self.locals\n'], 0), 
(<frame object at 0x7fa49ce70250>, '/usr/lib/python2.7/code.py', 87, 'runsource', ['  self.runcode(code)\n'], 0), 
(<frame object at 0x7fa49ced7d38>, '/usr/lib/python2.7/code.py', 265, 'push', ['  more = self.runsource(source, self.filename)\n'], 0), 
(<frame object at 0x3569a40>, '/usr/lib/python2.7/code.py', 243, 'interact', ['     more = self.push(line)\n'], 0), 
(<frame object at 0x7fa49ced39b0>, 'path_to_project/venv/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-linux-x86_64.egg/gevent/backdoor.py', 75, '_run', ['    console.interact(banner=self.banner)\n'], 0), 
(<frame object at 0x7fa49ced3b90>, 'path_to_project/venv/local/lib/python2.7/site-packages/gevent-1.0.2-py2.7-linux-x86_64.egg/gevent/greenlet.py', 327, 'run', ['    result = self._run(*self.args, **self.kwargs)\n'], 0) 
] 

위에서 보듯이 gevent는 스택을 다시 쓰고있는 것으로 보입니다. 프로그램을 시작하고있는 내 모듈의 run 함수가 포함되어 있지 않습니다. 백도어를 실행하는 greenlet의 run 메소드에서 멈 춥니 다.

실행중인 run 메서드를 검사하여 해당 변수를 검사하고 로컬 app 변수에 액세스 할 수있는 방법이 있습니까?

답변

0

좋아, 해결책을 찾았습니다. greenlet 개체에는 현재보고있는 개체를 생성 한 개체를 찾기위한 parent 특성이 있습니다. 그런 다음 greenlet에는 스택 추적을 저장하는 gr_frame 속성이 있습니다. 내가 값을 검사 할 수있는 실행 기능 run 내부 로컬 객체 app에 noow 액세스 할 수

>>> 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> 

: 나는 백도어 서버에 연결하고 나면 내 경우에 따라서

는, 그 같은 것 다른 속성들에 대한 정보를 얻고, 라이브 gevent 응용 프로그램을 디버그합니다.