第二十八章 调试工具

篇别:第五篇 调试与测试

本章学习目标

  • 配置 logging 分级输出,能按需打开 SQL / ORM 相关 logger。
  • 使用 pdb / breakpoint单 worker 下调试;了解 多 worker 限制。
  • 浏览器开发者工具 分析 JSON-RPC、OWL 渲染、静态资源
  • 正确区分 开发模式(--dev)生产配置,避免泄露与性能风险。

导读:调试是分层的

后端问题先看 日志与栈;交互复杂时上 pdb;前后端边界用 Networkcall_kw / call_button;前端纯逻辑用 Sources 断点--dev=all 能加速资产与模板迭代,但 绝不能 作为生产默认——本章强调 环境与隐私边界


28.1 日志系统

28.1.1 知识要点

  • 标准库 logging:Odoo 使用分层 logger,如 odooodoo.sql_dbodoo.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 日志文件中的 SQL 或业务行

28.1.4 本节练习

  1. 实操:为 library.loancreateINFO 日志,包含 idpartner_id
  2. 简答:为何 DEBUG SQL 不适合长期开在 共享测试环境

参考答案提示:2. 日志体积、隐私、I/O 开销。


28.2 pdb 调试

28.2.1 知识要点

  • import pdb; pdb.set_trace() 或 Python 3.7+ breakpoint();在 请求处理线程 中进入交互调试。
  • 多 worker / 多进程:断点可能落在 非你点击的那条 worker临时 --workers=0affinity 策略。
  • 超时:反向代理 read timeout 可能导致调试会话 被掐断;长调试用 shell单元测试 更稳。
  • 替代ipdbweb_pdb(需注意 安全风险,仅内网)。

28.2.2 案例

def action_confirm(self):
    breakpoint()  # 进入后 p self / n / c
    return super().action_confirm()

28.2.3 截图占位

图 28-2 终端 pdb 栈帧与变量

28.2.4 本节练习

  1. 简答4 worker 下浏览器触发的请求 有时不进断点,为什么?怎么办?
  2. 判断:提交代码前 必须删除 所有 breakpoint()。( )

参考答案提示:1. 请求打到别的 worker;改 workers=0 或只调试用进程。2. 对。


28.3 浏览器开发者工具(新增)

28.3.1 知识要点

  • Network:筛选 call_kwcall_buttondataset 等;查看 payload(模型、方法、args)与 响应 / 错误栈(若开启 debug)。
  • Performance:录制 列表打开、看板滚动 找长任务;与 第三十一章 性能章节衔接。
  • Sources:OWL 组件 map 可用时 下断点生产资产常压缩,依赖 source map 策略
  • ApplicationCookie、Session、LocalStorage;排查 多数据库、多标签 会话混淆。

28.3.2 案例

  1. 打开 列表视图Network → 找到 /web/dataset/call_kw
  2. 记录 请求 JSONmodelmethod(如 search_read)、argskwargs
  3. 对照 后端 对应方法与 domain

28.3.3 截图占位

图 28-3 Network 过滤 call_kw

28.3.4 本节练习

  1. 实操:记录一次 search_read字段列表domain,说明是否 多读了字段(性能意识)。
  2. 简答OWL 报错白屏时,ConsoleNetwork 各看什么?

参考答案提示:2. Console 看组件栈;Network 看 RPC 4xx/5xx 与响应体。


28.4 Debug 模式(新增)

28.4.1 知识要点

  • --dev=all(或 qwebreloadxml 等子选项):资产重载、模板便利暴露更多错误信息
  • 生产:禁用 --dev;使用 反向代理缓存正确 log_level
  • 资产:开发时可 ?debug=assets(以版本为准)配合 浏览器禁用缓存;避免用户误用导致 极慢首屏

28.4.2 案例

# 仅本地
./odoo-bin --dev=qweb,reload -c dev.conf

28.4.3 截图占位

图 28-4 设置中激活开发者模式(示意)

28.4.4 本节练习

  1. 判断:生产开启 --dev=all 可接受。( )
  2. 简答开发者模式(设置里切换)与 --dev 启动参数 差异 一句话说明。

参考答案提示:1. 错。2. 启动参数影响服务器级重载与范围;设置里多为 UI 功能(技术菜单等),以版本文档为准。


本章综合练习

  1. 案例列表很慢 → 如何用 日志 + SQL logger + Network 组合判断是 N+1 还是 单次重查询
  2. 隐私:日志 脱敏 规则三条(如 邮箱、电话、token)。
  3. 综合:画一张 「请求从浏览器到 ORM」 的调试点清单(至少 5 步)。
  4. 实操:在 HttpCase 中失败时,如何用 日志 区分 404 与 500?(口述步骤即可。)

本章对应白皮书目录:第二十八章 调试工具。