第二十八章 调试工具
篇别:第五篇 调试与测试
本章学习目标
- 配置 logging 分级输出,能按需打开 SQL / ORM 相关 logger。
- 使用 pdb / breakpoint 在 单 worker 下调试;了解 多 worker 限制。
- 用 浏览器开发者工具 分析 JSON-RPC、OWL 渲染、静态资源。
- 正确区分 开发模式(--dev) 与 生产配置,避免泄露与性能风险。
导读:调试是分层的
后端问题先看 日志与栈;交互复杂时上 pdb;前后端边界用 Network 看 call_kw / call_button;前端纯逻辑用 Sources 断点。--dev=all 能加速资产与模板迭代,但 绝不能 作为生产默认——本章强调 环境与隐私边界。
28.1 日志系统
28.1.1 知识要点
- 标准库
logging:Odoo 使用分层 logger,如odoo、odoo.sql_db、odoo.modules.loading等;--log-level=debug全局很吵,宜 按 logger 细调。 - SQL 调试:
odoo.sql_db:DEBUG或文档推荐的 schema 相关 logger 可打印 SQL;生产禁用,注意 敏感数据 进日志。 - 业务日志:
import logging; _logger = logging.getLogger(__name__);extra={'dbname': ...}等多实例时便于区分。 - 日志落盘:
--logfile=;容器环境常 stdout + 外部采集(ELK 等)。
28.1.2 案例
# 开发机临时看 SQL(慎用;logger 名以当前版本为准)
./odoo-bin -c odoo.conf -d mydb --log-handler=odoo.sql_db:DEBUG
import logging
_logger = logging.getLogger(__name__)
def create(self, vals_list):
recs = super().create(vals_list)
for r in recs:
_logger.info("library.loan created id=%s", r.id)
return recs
28.1.3 截图占位

28.1.4 本节练习
- 实操:为
library.loan的create打 INFO 日志,包含id与partner_id。 - 简答:为何 DEBUG SQL 不适合长期开在 共享测试环境?
参考答案提示:2. 日志体积、隐私、I/O 开销。
28.2 pdb 调试
28.2.1 知识要点
import pdb; pdb.set_trace()或 Python 3.7+breakpoint();在 请求处理线程 中进入交互调试。- 多 worker / 多进程:断点可能落在 非你点击的那条 worker → 临时
--workers=0或 affinity 策略。 - 超时:反向代理 read timeout 可能导致调试会话 被掐断;长调试用 shell 或 单元测试 更稳。
- 替代:
ipdb、web_pdb(需注意 安全风险,仅内网)。
28.2.2 案例
def action_confirm(self):
breakpoint() # 进入后 p self / n / c
return super().action_confirm()
28.2.3 截图占位

28.2.4 本节练习
- 简答:4 worker 下浏览器触发的请求 有时不进断点,为什么?怎么办?
- 判断:提交代码前 必须删除 所有
breakpoint()。( )
参考答案提示:1. 请求打到别的 worker;改 workers=0 或只调试用进程。2. 对。
28.3 浏览器开发者工具(新增)
28.3.1 知识要点
- Network:筛选
call_kw、call_button、dataset等;查看 payload(模型、方法、args)与 响应 / 错误栈(若开启 debug)。 - Performance:录制 列表打开、看板滚动 找长任务;与 第三十一章 性能章节衔接。
- Sources:OWL 组件 map 可用时 下断点;生产资产常压缩,依赖 source map 策略。
- Application:Cookie、Session、LocalStorage;排查 多数据库、多标签 会话混淆。
28.3.2 案例
- 打开 列表视图 → Network → 找到
/web/dataset/call_kw。 - 记录 请求 JSON:
model、method(如search_read)、args与kwargs。 - 对照 后端 对应方法与 domain。
28.3.3 截图占位

28.3.4 本节练习
- 实操:记录一次
search_read的 字段列表 与 domain,说明是否 多读了字段(性能意识)。 - 简答:OWL 报错白屏时,Console 与 Network 各看什么?
参考答案提示:2. Console 看组件栈;Network 看 RPC 4xx/5xx 与响应体。
28.4 Debug 模式(新增)
28.4.1 知识要点
--dev=all(或qweb、reload、xml等子选项):资产重载、模板便利;暴露更多错误信息。- 生产:禁用
--dev;使用 反向代理缓存 与 正确log_level。 - 资产:开发时可
?debug=assets(以版本为准)配合 浏览器禁用缓存;避免用户误用导致 极慢首屏。
28.4.2 案例
# 仅本地
./odoo-bin --dev=qweb,reload -c dev.conf
28.4.3 截图占位

28.4.4 本节练习
- 判断:生产开启
--dev=all可接受。( ) - 简答:开发者模式(设置里切换)与
--dev启动参数 差异 一句话说明。
参考答案提示:1. 错。2. 启动参数影响服务器级重载与范围;设置里多为 UI 功能(技术菜单等),以版本文档为准。
本章综合练习
- 案例:列表很慢 → 如何用 日志 + SQL logger + Network 组合判断是 N+1 还是 单次重查询?
- 隐私:日志 脱敏 规则三条(如 邮箱、电话、token)。
- 综合:画一张 「请求从浏览器到 ORM」 的调试点清单(至少 5 步)。
- 实操:在 HttpCase 中失败时,如何用 日志 区分 404 与 500?(口述步骤即可。)
本章对应白皮书目录:第二十八章 调试工具。