25、WebRTC调试与排错:常用调试工具(chrome://webrtc-internals)、常见错误码分析、日志分析技巧

做WebRTC开发,最头疼的是什么?

不是写代码,是出了问题你根本不知道它卡在哪。信令通了没?ICE候选到了没?DTLS握手失败还是SDP协商错了?

我刚开始搞WebRTC那会儿,经常对着黑屏干瞪眼。后来摸清了几个调试路子,才慢慢有了「手感」。今天我把压箱底的经验掏出来,跟你聊聊怎么用工具、看日志、分析错误码。

一、chrome://webrtc-internals —— 你的第一把手术刀

这个页面,说白了就是Chrome给WebRTC开的「黑匣子」。你只要在浏览器里打开一个WebRTC应用,再新开标签页输入 chrome://webrtc-internals,所有底层细节全摊在你面前。

核心价值:不用猜,直接看ICE状态、RTT、丢包率、比特率、SDP原文。

我个人习惯,一上来先看三个面板:

  1. Stats Table —— 实时数据表。重点关注 googRtt(往返时延)和 packetsLost(丢包数)。如果RTT突然飙到500ms以上,八成是网络问题。
  2. ICE Connection State —— 连接状态。看到 connected 才放心,如果一直是 checkingdisconnected,那就要查STUN/TURN配置了。
  3. SDP Offer/Answer —— 原始SDP文本。我遇到过好几次,明明是H264编码,结果SDP里写的是VP8,双方协商失败。这种坑,看界面是看不出来的,必须看原文。

小技巧:在webrtc-internals页面里,按 Ctrl+F 搜索 failederror,能快速定位异常行。我曾经靠这个在5分钟内找到了一个ICE候选地址格式错误的问题。

二、常见错误码分析 —— 别被数字吓到

WebRTC的错误码其实不多,但每个都挺要命。我整理了一张表,你遇到问题直接对照着查。

错误码 含义 常见原因 我的处理经验
kIceConnectionFailed ICE连接失败 STUN/TURN服务器不可达、防火墙阻挡 先ping一下STUN服务器IP,很多时候是UDP端口被禁了
kMediaStreamError 媒体流错误 摄像头/麦克风被占用、权限未授予 检查浏览器地址栏左侧的摄像头图标,看看是不是被禁了
kSdpParseError SDP解析失败 SDP格式错误、缺少必要字段 把SDP原文复制出来,用在线SDP解析工具看,通常能找到缺失的行
kDtlsFailure DTLS握手失败 证书不匹配、TLS版本不一致 检查两端是否都用了自签名证书,如果是,需要设置 certificates 选项
kInvalidState 状态无效 在错误时机调用了API(如连接未建立就发数据) 加日志打印 peerConnection.connectionState,确保状态是 connected 再操作

注意:错误码在JavaScript层有时会被封装成 DOMException,你需要在 catch 块里打印 error.nameerror.message,才能看到真正的WebRTC错误码。

三、日志分析技巧 —— 从海量信息里捞针

WebRTC的日志默认是不全的。你需要手动开启详细日志。我个人习惯在启动浏览器时加这些参数:

--enable-logging --v=1 --vmodule=*/webrtc/*=2

这样会把WebRTC模块的日志级别调到2(info级别),输出到终端或日志文件。你想想看,没有这些日志,你连ICE候选是IPv4还是IPv6都不知道。

拿到日志后,我一般按这个顺序排查:

  1. 搜 "ERROR" 或 "WARNING" —— 先看有没有明显的红色错误。比如 ERROR: ICE failed to allocate candidates,那问题就在网络层。
  2. 搜 "ICE" 关键词 —— 看ICE状态机变化。正常流程是:checkingconnectedcompleted。如果卡在 checking 超过10秒,基本就是STUN没响应。
  3. 搜 "SDP" 关键词 —— 确认双方SDP是否一致。重点看 a=rtpmapa=fmtp 行,编码参数不匹配会导致黑屏。
  4. 搜 "DTLS" 关键词 —— 握手失败通常会有 DTLS handshake failed 字样,后面会跟一个SSL错误码,比如 SSL_ERROR_SSLSSL_ERROR_NO_CYPHER_OVERLAP

避坑指南:我曾经花了一整天查一个「偶尔连不上」的问题。日志里没有任何错误,就是ICE状态在 checkingdisconnected 之间反复跳。后来发现是TURN服务器返回的 relay 候选地址端口号写错了。嗯,这种间歇性故障最坑人,一定要把日志级别开到 --v=2 才能看到细节。

四、知识体系总览

下面这张图,是我自己总结的WebRTC调试排错全景。你照着这个思路走,90%的问题都能定位到根因。

WebRTC 调试排错全景图 chrome://webrtc-internals 错误码分析 日志分析技巧 Stats Table / ICE状态 / SDP原文 kIceConnectionFailed / kDtlsFailure --v=1 日志 / 关键词搜索 网络不通 / 编码不匹配 证书问题 / 状态机异常 间歇性断连 / 日志不全 核心思路:先看工具 → 再查错误码 → 最后深挖日志

五、实战:一个典型的排错流程

假设你遇到一个问题:两个浏览器之间视频通话,A能看到B,但B看不到A。你会怎么查?

我的做法是这样的:

  1. 打开 chrome://webrtc-internals,看B的 inbound-rtp 统计。如果 packetsReceived 是0,说明B根本没收到A的视频包。
  2. 再看A的 outbound-rtp,如果 packetsSent 在增长,说明A在发,但B没收到。问题出在网络或ICE上。
  3. 切到ICE面板,看A和B的ICE候选。如果A只有 host 候选,没有 srflxrelay,那说明STUN/TURN没配置对。
  4. 最后翻日志,搜 ICESTUN,确认是否收到了STUN响应。

你看,整个过程不超过10分钟。没有工具和日志,你只能靠猜。

记住:WebRTC调试的核心就三件事 —— 看数据、读日志、查错误码。把这三点练熟了,你就是团队里的WebRTC救火队员。

好了,这一章的内容就到这里。调试工具和技巧都给你了,剩下的就是多练。遇到问题别慌,打开webrtc-internals,搜关键词,看错误码,一步步来,总能找到根因。

公众号:蓝海资料掘金营,微信deep3321