Error: No connected probes were found.
主线位置:命令主线第二步「选探针」。
probe-rs run在 attach、烧录之前,先发一个probe/select请求让服务端枚举探针;列表为空就是这个报错。机制见一条 probe-rs run 和 DebugProbe 与驱动注册表。
flowchart TB cmd["run、download、info、cargo flash"] --> sel["probe/select:Lister 问每个驱动"] sel -->|"0 个"| err["NoProbesFound:No connected probes were found."] sel -->|"1 个"| open["打开它"] sel -->|"多个"| ask["终端里选序号"] open -->|"没有权限"| perm["打开失败:另一个报错"] gdb["gdb --dry-run"] --> sa["simple_attach:FakeProbe"] sa --> ok["不选探针,起 GDB 服务端"]
现象
本机没有探针。四个常用入口,同一句话:
$ cargo run --release
Running `probe-rs run --chip STM32L475VGTx <target>/thumbv7em-none-eabihf/release/defmt-demo`
Error: No connected probes were found.
$ probe-rs run --dry-run --chip STM32L475VGTx fw.elf
Error: No connected probes were found.
$ probe-rs info --dry-run
Could not attach to target. Try running with --verbose for more information about the target.
Error: No connected probes were found.
$ cargo flash --chip STM32L475VGTx --path fw.elf
Flashing fw.elf
Error No connected probes were found.
$ probe-rs list
No debug probes were found.
probe-rs run 的退出码是 1;list 不算错误,退出码 0。
从哪来
报错文字是 OperationError::NoProbesFound 的 Display(common_options.rs:495)。走 RPC 的命令里,它由服务端的 select_probe 在列表长度为 0 时返回:
// probe-rs-tools/src/bin/probe-rs/rpc/functions/probe.rs
let mut list = lister.list_with_access(request.probe.map(|sel| sel.into()).as_ref());
// ...
match list.len() {
0 => Err(OperationError::NoProbesFound.into()),
1 => Ok(SelectProbeResult::Success(with_interface(
DebugProbeEntry::from(list.swap_remove(0)),
))),
_ => Ok(SelectProbeResult::MultipleProbes(/* ... */)),
}
Lister 让 DRIVERS 表里的每个驱动枚举自己认得的 USB 设备(DebugProbe 与驱动注册表)。所以「零个」的意思很窄:没有一个驱动在 USB 上认出自己的设备。几种常见原因:
| 情形 | 为什么是零个 |
|---|---|
| 没插,或用的是只供电不传数据的线 | USB 上根本没有设备 |
| 探针固件不在任何驱动的认领范围里 | 比如 VID / PID 不在表里,或者是插件提供的驱动而插件没注册(库用户的情形,见找不到 esp32c3) |
给了 --probe VID:PID[:序列号] 而写错了 | 选择器把列表过滤空了 |
| Windows 上没装对驱动 | cargo-flash 的提示里专门写了 J-Link 要用 Zadig 装驱动(下文);本卷没有 Windows 环境,未核实 |
权限问题通常不是这一条。 list_with_access 的文档写明:「Probes that cannot be accessed are still included, marked Accessibility::PermissionDenied」(probe/list.rs:109)。Linux 上没装 udev 规则时探针仍会出现在列表里,失败发生在下一步「打开」,报的是另一个错误。这是按源码推断的,本卷没有 Linux 加探针的环境,待实测。
--dry-run 为什么没用
run、download、info 都有 --dry-run,但它在服务端的 attach_probe 里才被看到,而客户端在发 probe/attach 之前已经发了 probe/select,后者不看 dry_run(一条 probe-rs run)。所以这三个命令的 --dry-run 在没有探针时一律失败在选探针上。真正生效的只有 probe-rs gdb --dry-run:它不走 RPC,simple_attach 直接调 attach_probe,换上 FakeProbe(gdb server)。
gdb --dry-run 也有边界:选 nRF52 系列会 panic 在「No more operations expected」,因为 nRF 的调试序列要读 CTRL-AP,而 FakeProbe 只有预先登记的应答才答得上来;--connect-under-reset 则撞上 todo!()。这些是 FakeProbe 的限制,不是用户的错(FakeProbe)。
提示去哪了
源码里有两套「找不到探针时的提示」:
- 命令行公用的
print_setup_hints:只在 Linux 上编译进去,打三行warn日志,指向 udev 规则的文档;环境变量PROBE_RS_DISABLE_SETUP_HINTS可以关掉。本机是 macOS,所以上面的输出里没有。 - cargo-flash 自己的
render_diagnostics:对NoProbesFound准备了 Linux udev、Windows 驱动、探针设置指南三条提示。
后者在实验里一条也没出现。原因是错误穿过了 RPC:cli::attach_probe 返回的是 anyhow::Error,转成 OperationError 时落进的是 Anyhow(#[from] anyhow::Error) 这个透明变体,而不是 NoProbesFound,诊断表按变体匹配,于是只打印错误本身。这是「本地也走 RPC」的一个小代价(设计取舍)。
怎么办
- 先跑
probe-rs list。它列不出来,问题在 USB 或驱动,和芯片、固件、--chip都无关。 - 列得出来但
run失败,看报错是不是换了:权限问题、多个探针(非交互模式下报「N probes were found」)、选择器写错。 - 只是想在没有硬件时走一遍流程:
gdb --dry-run是命令行里唯一有效的 dry-run;更完整的办法是在库里用FakeProbe,或者自己实现一个探针(写一个软件探针)。
小结
- 「No connected probes were found.」只说明
Lister一个设备也没认出来,发生在 attach 之前,和芯片、固件无关。 - 没权限的探针仍会被列出,失败在打开那一步,报的是别的错(按源码推断,待实测)。
run、download、info的--dry-run在没有探针时没用,只有gdb --dry-run真的换上FakeProbe。- Linux 才有安装提示;cargo-flash 的诊断提示因为错误穿过 RPC 变成了
anyhow,实际不会出现。