如何使用远程pdb连接调试在Heroku上运行的Django应用程序?

时间:2013-04-04 03:05:01

标签: python django debugging heroku pdb

要调试我在Heroku上看到但在本地计算机上没有看到的错误,我正在尝试进行逐步调试。

典型的import pdb; pdb.set_trace()方法不适用于Heroku,因为您无法访问连接到应用程序的控制台,但显然您可以使用rpdb,一个“远程”版本的pdb 。

所以我安装了rpdb,在适当的位置添加了import rpdb; rpdb.set_trace()。当我发出命中rpdb行的请求时,应用程序按预期挂起,我在heroku日志中看到以下内容:

pdb is running on 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc:4444

好的,那么如何连接到正在运行的pdb?我已经尝试heroku run nc 3d0c9fdd-c18a-4cc2-8466-da6671a72cbc 4444尝试从heroku的系统中连接到命名主机,但只是立即退出状态1并且没有错误消息。

所以我的具体问题是:我现在如何连接到这个远程pdb?

一般相关的问题是:这是否是在Heroku上运行的应用程序的这种交互式调试的正确方法?有没有更好的办法?

注意RE CELERY:注意,我现在也尝试过与Celery类似的方法,但无济于事。默认主机celery的rdb(远程pdb包装器)使用的是localhost,当它是Heroku时你无法访问它。我已尝试将CELERY_RDB_HOST环境变量用于Heroku上托管的网站域,但这会产生“无法分配请求的地址”错误。所以它是相同的基本问题 - 如何连接到在Heroku上运行的远程pdb实例?

2 个答案:

答案 0 :(得分:2)

在回答第二个问题时,我会根据错误类型(浏览器端,后端或视图)采用不同的方式。对于后端和视图测试(单元测试),这样的东西会适合你吗?

$ heroku run --app=your-app "python manage.py shell --settings=settings.production"

然后在ipython中调试:

>>> %run -d script_to_run_unittests.py

即使您没有运行django应用程序,您也可以将调试器作为ipython的命令行选项运行,这样任何python错误都会让您进入调试器:

$ heroku run --app=your-app "ipython --pdb"

前端测试是一个完全不同的球赛,你应该看看像硒这样的工具。我认为还有一个“沙拉”测试套件模块,使前端测试更容易编写。编写一个破坏的测试是调试的第一步(或者我被告知;)。

如果错误看起来很简单,你可以随时使用类似

的旧版“打印并运行”
import logging
logger = logging.getLogger(__file__)
logger.warn('here be bugs')`

并使用getsentry.com或等效的监控工具或仅查看日志文件:

heroku logs --tail

答案 1 :(得分:1)

我认为你正在寻找这样的东西:

http://docs.celeryproject.org/en/latest/tutorials/debugging.html