14

为了调试我在 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 实例?

4

1 回答 1

3

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

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

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

如果错误看起来很简单,您可以随时使用类似的方法执行旧的“打印并运行”

import logging
logger = logging.getLogger(__file__)
logger.warn('here be bugs')`

并使用 getsentry.com 或等效的监控工具查看您的日志文件,或者只是:

heroku logs --tail
于 2013-04-04T05:30:00.747 回答