要调试我在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实例?
答案 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)