“Connection refused”直接原因是gdbserver或JLinkGDBServer未运行、未监听对应端口或被拦截;需用netstat验证监听状态、检查绑定地址(如*:2345)、确认进程存活、排查防火墙/adb forward/网络连通性,并确保JLink硬件连接正常。

gdb target remote 连接失败的直接原因
“Connection refused”不是GDB的问题,而是客户端根本没连上服务端——gdbserver 或 JLinkGDBServer 没在运行、没监听对应端口,或被系统拦截了。GDB只是忠实转达了操作系统返回的 errno 111。
检查 gdbserver 是否真正在监听端口
别只信“我刚敲了命令”,要验证它是否真的在监听:
- 运行
netstat -tuln | grep :2345(把2345换成你实际用的端口),看有没有LISTEN状态行;没有就说明gdbserver没起来,或启动时出错了但静默退出了 - 如果只看到
127.0.0.1:2345而不是*:2345,说明它只绑定了本地回环,远程 GDB 无法访问;改用gdbserver :2345 ./program(不带localhost:)才能监听所有接口 - 在目标设备上执行
ps aux | grep gdbserver,确认进程还在,没因权限/路径/so缺失而秒退
防火墙、adb forward 和网络可达性三连查
即使 gdbserver 在监听,中间链路一断,照样 Connection refused:
- Linux/macOS 主机:检查
ufw或firewalld是否放行目标端口;macOS Monterey+ 还要确认“系统设置 > 隐私与安全性 > 防火墙选项”里允许了调试工具 - 安卓调试场景:必须用
adb forward tcp:2345 tcp:2345把 PC 的2345映射到设备侧;漏掉这步,target remote localhost:2345实际连的是 PC 自己,当然拒绝 - 跨网段或远程主机:先
ping通 IP,再telnet target-ip 2345或nc -zv target-ip 2345;不通就不是 GDB 的问题,是网络或安全组拦住了
JLinkGDBServer 多客户端模式下的端口混淆
很多人以为 JLinkGDBServer -port 2331 启动后,target remote localhost:2331 就一定行——但默认它只开一个端口,且不支持并发连接。一旦已有 GDB 连上,第二个就会被拒:
- 确认你用的是 V7.50+ 版本,否则
-multiclient参数无效 - 启动时必须显式加
-multiclient,例如:JLinkGDBServer -device STM32F407VG -if SWD -speed 4000 -port 2331 -multiclient - 注意:管理端口
19021(Telnet)和调试端口2331是两个独立端口;Connection refused出现在2331上,说明调试通道未就绪,跟19021是否开启无关
最常被忽略的一点:J-Link 的 USB 连接状态不稳定时,JLinkGDBServer 可能已启动并监听了端口,但底层探针通信失败,导致后续所有 GDB 请求都返回拒绝——此时 netstat 看似正常,但 JLink Commander 里执行 connect 会报错。务必先用 JLink Commander 手动验证硬件连通性,再启动服务器。











