Autor Zpráva
David1234
Profil *
Ahoj, potřeboval bych poradit jak lze odkrokovat python aplikaci která je za Apache webserverem. Apache ke komunikaci s aplikací používá mod_wsgi. Našel jsem poměrně šikovný článek podle kterého jsem nastavil v konfiguraci příslušného apache vhosta následující:

WSGIScriptAlias /ipa /usr/share/ipa/wsgi.py
LogLevel info
StartServers 1
ServerLimit 1
WSGIRestrictStdout Off

V python scriptu wsgi.py jsem doplnil třídu Debugger (ze článku výše), zde je obsah celého souboru wsgi.py:

from ipalib import api
from ipalib.config import Env
from ipalib.constants import DEFAULT_CONFIG

env = Env()
env._bootstrap(context='server', log=None)
env._finalize_core(**dict(DEFAULT_CONFIG))

class Debugger:

    def __init__(self, object):
        self.__object = object

    def __call__(self, *args, **kwargs):
        import pdb, sys
        debugger = pdb.Pdb()
        debugger.use_rawinput = 0
        debugger.reset()
        sys.settrace(debugger.trace_dispatch)

        try:
            return self.__object(*args, **kwargs)
        finally:
            debugger.quitting = 1
            sys.settrace(None)

# Initialize the API with the proper debug level
api.bootstrap(context='server', debug=env.debug, log=None)
try:
    api.finalize()
except StandardError, e:
    api.log.error('Failed to start IPA: %s' % e)
else:
    api.log.info('*** PROCESS START ***')

    # This is the WSGI callable:
    def application(environ, start_response):
        response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
        response_body = 'n'.join(response_body)
        if not environ['wsgi.multithread']:
            return api.Backend.wsgi_dispatch(environ, start_response)
        else:
            api.log.error("IPA does not work with the threaded MPM, use the pre-fork MPM")

    application = Debugger(application)

Nyní když spustím apache pomocí příkazu httpd -X tak se dostanu až do python debuggeru, ale vypadá to že nekrokuji aplikaci:

(Pdb) l
 61      else:
 62          api.log.info('*** PROCESS START ***')
 63      
 64          # This is the WSGI callable:
 65          def application(environ, start_response):
 66  ->            response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
 67              response_body = 'n'.join(response_body)
 68              if not environ['wsgi.multithread']:
 69                  return api.Backend.wsgi_dispatch(environ, start_response)
 70              else:
 71                  api.log.error("IPA does not work with the threaded MPM, use the pre-fork MPM")
(Pdb) n
> /usr/share/ipa/wsgi.py(66)application()
-> response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
(Pdb) n
> /usr/share/ipa/wsgi.py(66)application()
-> response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
(Pdb) n
> /usr/share/ipa/wsgi.py(66)application()
-> response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
(Pdb) n

Pokud mačkám pořád next dostanu se až na toto místo:

> /usr/share/ipa/wsgi.py(69)application()->['<?xml versio...odResponse>\n']
-> return api.Backend.wsgi_dispatch(environ, start_response)
(Pdb) l
 64          # This is the WSGI callable:
 65          def application(environ, start_response):
 66              response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
 67              response_body = 'n'.join(response_body)
 68              if not environ['wsgi.multithread']:
 69  ->                return api.Backend.wsgi_dispatch(environ, start_response)
 70              else:
 71                  api.log.error("IPA does not work with the threaded MPM, use the pre-fork MPM")
 72      
 73          application = Debugger(application)
[EOF]

Kdy dojde klientovi odpověď. Moje otázka zní jak odkrokovat celou aplikaci? Potřebuji v ní najít jedno místo ale jelikož jsem aplikaci nepsal já přijde mi nejjednodušší to místo najít pomocí odkrokování requestu. Předem všem děkuji za rady.
Davex
Profil
Pokud se chceš dostat dovnitř aplikace, tak asi musíš místo n(ext) použít s(tep).
David1234
Profil *
Step se v tomto případě chová úplně stejně jako next:

...
> /usr/share/ipa/wsgi.py(66)application()
-> response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
(Pdb) s
> /usr/share/ipa/wsgi.py(67)application()
-> response_body = 'n'.join(response_body)
(Pdb) s
> /usr/share/ipa/wsgi.py(68)application()
-> if not environ['wsgi.multithread']:
(Pdb) l
 63      
 64          # This is the WSGI callable:
 65          def application(environ, start_response):
 66              response_body = ['%s: %s' % (key, value) for key, value in sorted(environ.items())]
 67              response_body = 'n'.join(response_body)
 68  ->            if not environ['wsgi.multithread']:
 69                  return api.Backend.wsgi_dispatch(environ, start_response)
 70              else:
 71                  api.log.error("IPA does not work with the threaded MPM, use the pre-fork MPM")
 72      
 73          application = Debugger(application)



Tak opravuji, nechová! Bylo to moji netrpělivostí. Děkuji za radu! Ještě jsem se chtěl zeptat dá se přeskočit třeba 10x s? Nějaký zápis jako 10s nebo tak něco? Abych mohl skákat po větších kusech?

Ještě jednou moc děkuji.
Davex
Profil
Pro spuštění delší části kódu je asi vhodnější použít breakpoint.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: