【问题标题】:How to debug python application under uWSGI?如何在uWSGI下调试python应用程序?
【发布时间】:2013-08-25 10:18:54
【问题描述】:

当我尝试在 uWSGI 下使用 python pdb 调试器时,执行不会在断点处停止,它只是返回 trackback。

代码如下:

def application(env, start_response):
    import pdb; pdb.set_trace()
    start_response('200 OK', [('Content-Type','text/html')])
    return "Hello World"

这就是我运行它的方式:

uwsgi --http 127.0.0.1:7777  --wsgi-file uwsgi_test.py

这就是我得到的:

/home/andrey/Development/ttt/uwsgi_test.py(3)application()
-> start_response('200 OK', [('Content-Type','text/html')])
(Pdb) 
Traceback (most recent call last):
  File "uwsgi_test.py", line 3, in application
    start_response('200 OK', [('Content-Type','text/html')])
  File "uwsgi_test.py", line 3, in application
    start_response('200 OK', [('Content-Type','text/html')])
  File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit
[pid: 11421|app: 0|req: 1/1] 127.0.0.1 () {32 vars in 366 bytes} [Sun Aug 25 13:12:06 2013] GET / => generated 0 bytes in 63 msecs (HTTP/1.1 500) 0 headers in 0 bytes (0 switches on core 0)

【问题讨论】:

  • 您是否尝试过以不同的方式调试它(即,而不是使用 set_trace() 手动插入断点)?
  • 我在简单的文本编辑器中开发它,没有任何 IDE。所以我知道的唯一选择是断点。
  • 查看这篇文章:stackoverflow.com/questions/6980749/… 除了一个好的 IDE 真的可以让你的生活变得更轻松(并有助于提高生产力等)。

标签: python uwsgi


【解决方案1】:

作为服务器,uWSGI 会关闭标准输入(实际上它会将其重新映射到 /dev/null)。

如果您需要标准输入(就像您需要终端调试器时一样)添加:

--honour-stdin

【讨论】:

  • 有点不言而喻,但万一其他人没有意识到这一点,您还需要确保您没有在守护进程模式下运行 uwsgi。否则,您必须在事后将终端连接到进程的标准输入/标准输出(这甚至可能吗?)。
  • @DavidSanders 如何在没有守护程序模式的情况下运行 uwsgi?
  • uwsgi --http-socket :8000 --wsgi-file uwsgi_test.py --callable application --virtualenv /opt/virtualenvs/uwsgi_test --honour-stdin 为我工作
  • 可以添加--workers 1,这样你只需要担心一个工人,--harakiri 1200 给你 20 分钟的调试时间,否则它可能会在 60 秒后重生。
【解决方案2】:

安装远程调试器。

pip install remote-pdb

在应用程序的某处设置断点。

from remote_pdb import RemotePdb
RemotePdb('127.0.0.1', 4444).set_trace()

通过 telnet 连接到远程调试器

# Restart uwsgi to pick up changes
...

# Trigger the breakpoint, (any action to evaluate the set_trace call)
...

# Connect to debugger
telnet 127.0.0.1 4444

您可能希望使用单个工作线程/线程运行 uWSGI,这样远程调试器就不会相互干扰。

【讨论】:

    【解决方案3】:

    试试这个

    uwsgi --http 127.0.0.1:7777  --wsgi-file uwsgi_test.py --logto /path/to/log/log.txt
    

    【讨论】:

    • 这不是调试,甚至没有给出正确的 python 堆栈跟踪
    • 它没有回答问题,但这条评论对我有帮助。
    猜你喜欢
    • 2012-11-01
    • 1970-01-01
    • 2011-01-13
    • 2023-03-19
    • 2012-12-05
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多