Skip to main content
lager diagnose <net> --box <box> [--type <role>] 对异常的仪器 Net 做一次性诊断。它把手动调试的整套流程(lsofdmesg、裸 pyvisa 探测、硬件服务内省)压缩成一条 CLI 调用。这条调用返回一个可据以行动的分类:主机侧问题、仪器卡死,或者一切正常。
lager 0.20.0 中为 USB-TMC(pyvisa)仪器引入。在 0.28.3 中扩展到诊断 debug Net(SEGGER J-Link,以及基础的 OpenOCD/ST-Link 路径)—— 请参阅下方的 调试 Net(J-Link)

语法

选项

NET 是要诊断的 Net 名称(例如 battery1supply1)。

用法

该命令并行查询三个 Box 侧端点,为每一个打印一节内容,最后给出一行分类结论和下一步建议。

输出各节

USB(主机侧)

来自 Box 端口 9000 上的 GET /diagnose/usb。报告:
  • enumerated —— 该设备是否出现在主机的 USB 总线上?
  • sysfs —— 内核 sysfs 路径(例如 /sys/bus/usb/devices/1-4)。
  • device —— lsof/fuser 使用的 /dev/bus/usb/BBB/DDD 路径。
  • usbtmc —— usbtmc 内核模块是否已加载(如果已加载,它会与 libusb 争抢接口 0)。
  • lsof —— 持有该 USB 设备文件的进程列表,形式为 command(pid)
  • dmesg tail —— 最后几条 USB / usbtmc 内核消息。

VISA(仪器侧)

来自 Box 端口 9000 上的 GET /diagnose/visa。它打开一个全新的 pyvisa 会话,并以较短的超时查询 *IDN?。如果硬件服务已经为这个地址持有一个共享会话,它会跳过打开动作并说明这一点。发生冲突时,要么会卡住,要么会返回乱码。报告:
  • idn —— 仪器响应时给出的 IDN 字符串。
  • elapsed —— 实际耗时,单位毫秒。
  • error / error_class —— 分类为 busynodevtimeoutother
  • skipped —— 当硬件服务持有该地址时被置位。

Dispatcher(hw_service 进程内)

来自硬件服务端口 8080 上的 GET /diagnose/dispatcher。报告该地址在进程内的状态:
  • cached_session —— 共享的 pyvisa 会话池中是否有它。
  • cached_drivers —— 针对该地址缓存的驱动实例。
  • shared_pool —— 会话池的总大小。

分类

判定树按以下顺序进行(首个匹配者胜出):

会话示例

卡死的仪器会被清楚地指出来,这样您就不会再徒劳地尝试纯软件的恢复手段:
使用厂商 SDK 的仪器(LabJack、Picoscope、Acroname)不经过 pyvisa,因此 lager diagnose 会把您指向针对该角色的命令,而不是返回一个会误导人的 UNCLEAR

调试 Net(J-Link)

debug Net 不是 USB-TMC,因此上面的 pyvisa *IDN? 探测无法触及它。当该 Net 的角色是 debug 时(自动识别,或用 --type debug 强制指定), lager diagnose 会改走一条了解 J-Link 的路径。它获取同样的主机侧 USB 一节,外加一个专用的 /diagnose/jlink 端点,然后由外向内逐层检查调试栈:软件 → USB → 探针可见性 → gdbserver → 目标连接。这个顺序意味着最具体、最可操作的故障会胜出。
USB(主机侧) 一节之外,debug Net 还会打印一节 J-Link / 调试探针,报告:
  • backend —— 探针后端(jlink,或某个 OpenOCD/ST-Link 后端)。
  • jlink software —— Box 上是否安装了 SEGGER J-Link 工具。
  • probe enum —— 该探针是否出现在主机的 USB 总线上?
  • probe visible —— JLinkExe 是否真的枚举到了该探针(带仿真器型号/序列号列表)?
  • holders —— 持有该探针的进程,形式为 command(pid)(通常是残留的 gdbserver)。
  • gdbserver —— J-Link gdbserver 是否存活、它的 PID,以及它的日志文件是否正常。
  • connect —— 目标连接探测的结果:connect_ok、错误类别、VTref(目标参考电压),以及识别到的 core。当失败无法归类时,会显示 JLinkExe 的原始输出。
SEGGER 探针会得到上面完整的检查栈。非 J-Link 的 OpenOCD/ST-Link 探针只报告较简略的 openocd-basic 一节(后端、探针枚举和 gdbserver 状态)—— 深入的目标诊断目前只支持 J-Link。

调试相关的分类

调试会话示例

被锁定的目标会被清楚地指出来,这样您就能直接采用正确的恢复手段:

向后兼容

对 0.20 之前的 Box,每个端点都返回 404。此时 CLI 会说明该节不可用,因为那台 Box 可能运行着 lager < 0.20 的镜像。其余各节仍会运行 —— lager diagnose 对较旧的 Box 依然有用,只是信息少一些。

参见

  • Instruments —— 列出已连接的仪器及其 VISA 地址
  • Nets —— 列出已保存的 Net 及其角色
  • Debug —— 调试 Net 的连接、烧录和 gdbserver 控制
  • Hello —— 基本的 Box 连通性和版本检查