20、日志调试:启用 Chrome 的 --enable-logging 参数,分析 webrtc 日志文件

说实话,做 WebRTC 开发最头疼的是什么?不是代码写不出来,而是出了问题你根本不知道它死在哪。网络通了没?信令发出去没?媒体流有没有建立?这些信息,光靠 console.log 是远远不够的。

我个人习惯,一上来就先开日志。Chrome 的 --enable-logging 参数,说白了就是给浏览器装了个黑匣子。你飞的时候可能感觉不到,但一旦坠机,这玩意儿能帮你还原事故现场。

为什么需要日志调试?

WebRTC 的调用链路很长。从 getUserMedia 获取摄像头,到 createOffer 创建 SDP,再到 ICE 协商、DTLS 握手、SRTP 加密……任何一个环节出问题,表现可能只是「黑屏」或「卡顿」。但原因可能藏在几十个异步回调里。

我记得有一次,用户反馈视频一直黑屏。我查了半天代码,逻辑没问题啊。最后打开日志一看,原来是摄像头被别的应用占用了,getUserMedia 返回了 NotReadableError。console 里只打印了一个模糊的 DOMException,但日志里清清楚楚写着设备冲突。

所以,日志不是万能的,但没有日志是万万不能的。

启用 Chrome 日志的两种方式

嗯,这里要注意,不同系统下操作略有不同。我直接给你总结成表格,省得你翻文档。

操作系统 命令行示例 日志输出位置
Windows chrome.exe --enable-logging --v=1 %LOCALAPPDATA%\Google\Chrome\User Data\chrome_debug.log
macOS /Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --enable-logging --v=1 ~/Library/Application Support/Google/Chrome/chrome_debug.log
Linux google-chrome --enable-logging --v=1 ~/.config/google-chrome/chrome_debug.log

参数说明:

  • --enable-logging:开启日志输出,默认是关闭的。
  • --v=1:日志详细级别。0 是最简,1 是推荐,2 以上会刷屏(我一般只用 1)。
  • --vmodule=*/webrtc/*=2:只对 webrtc 模块开启详细日志,其他模块保持安静。这个我强烈推荐,不然日志文件会大到吓人。
我的小技巧: 在 macOS 上,我习惯写个 alias:alias chromedebug='open -a Google\ Chrome --args --enable-logging --v=1 --vmodule=*/webrtc/*=2'。每次调试直接敲 chromedebug 就行,省得记路径。

日志文件里到底有什么?

你打开 chrome_debug.log,可能会被吓到——密密麻麻全是时间戳和模块名。别慌,我教你抓重点。

WebRTC 相关的日志,通常以 [webrtc][rtc] 开头。你直接搜索这几个关键字就行。我个人习惯用 grep 或者编辑器里的搜索功能,先过滤出 webrtc 相关的行。

举个例子,这是我从一次成功通话中截取的关键日志片段:

[2025-03-20 10:15:23.456] [webrtc] CreateSessionDescription: type=offer
[2025-03-20 10:15:23.789] [webrtc] SetLocalDescription: type=offer
[2025-03-20 10:15:24.012] [webrtc] ICE: New candidate: 192.168.1.100:54321
[2025-03-20 10:15:24.345] [webrtc] ICE: New candidate: 10.0.0.1:54321 (srflx)
[2025-03-20 10:15:24.678] [webrtc] ICE: New candidate: 2001:db8::1:54321 (relay)
[2025-03-20 10:15:25.001] [webrtc] ICE: Connection state changed: CHECKING -> CONNECTED
[2025-03-20 10:15:25.234] [webrtc] DTLS: Handshake completed
[2025-03-20 10:15:25.567] [webrtc] Media: Video track added: local_track_1

你看,整个流程一目了然:

  1. 创建了 offer
  2. 设置了本地描述
  3. 发现了三个 ICE 候选(本地、NAT、中继)
  4. ICE 连接建立
  5. DTLS 握手完成
  6. 媒体轨道添加成功

如果其中某一步卡住了,比如 ICE 一直处于 CHECKING 状态,那问题大概率出在网络连通性上。我曾经遇到过一个案例,ICE 始终无法从 CHECKING 变成 CONNECTED,日志里反复出现 STUN: request timeout。后来发现是公司的防火墙把 STUN 端口给封了。

常见问题与日志特征

我把平时遇到最多的几种情况整理了一下,你对照着看,能省不少时间。

问题现象 日志关键字 可能原因
黑屏/无视频 GetUserMedia failedNotReadableError 摄像头被占用或权限被拒绝
连接超时 ICE: TimeoutSTUN: request timeout 防火墙阻挡了 STUN/TURN 端口
媒体流卡顿 Packet loss: 15%Jitter: 200ms 网络质量差,丢包率高
无法建立连接 DTLS: Handshake failedCertificate error 证书问题或 DTLS 版本不匹配
只有音频没有视频 Video receive stream: inactive 远端没有发送视频,或 SDP 中视频被禁用
注意: 日志文件会非常大。一次 5 分钟的通话,日志可能轻松超过 100MB。建议你只开启 --v=1,并且用 --vmodule 限制模块。不然你的硬盘会报警的。

如何高效分析日志?

直接看原始日志,眼睛会瞎的。我推荐几个工具和方法:

  • grep 过滤grep "\[webrtc\]" chrome_debug.log > webrtc_only.log,只保留 webrtc 相关行。
  • 按时间线排序:日志本身是按时间顺序写的,但如果你合并了多个日志,可以用 sort 命令重新排序。
  • 关注状态变化:搜索 state changedfailederrortimeout 这些关键词,它们往往是问题的入口。
  • 对比成功与失败:我经常做的一件事,是先跑一次成功的通话,把日志存下来。然后复现 bug,再跑一次。用 diff 工具对比两个日志,差异点往往就是问题所在。

为什么会这样?因为成功的日志是一个「基线」,你只要看失败日志里多出了什么、少了什么,就能快速定位。

核心知识体系

下面这张图,是我自己总结的 WebRTC 日志调试流程。你照着这个思路走,基本不会漏掉关键信息。

WebRTC 日志调试流程 1. 启动 Chrome 并开启日志 2. 复现问题场景 3. 关闭 Chrome 4. 定位日志文件 5. 过滤 webrtc 相关日志 6. 搜索 error/timeout/failed 7. 对比成功/失败日志,定位根因

这张图的核心逻辑是:先拿到日志,再过滤,最后对比。你想想看,如果没有对比,你根本不知道哪些日志是「异常」的。我每次排查问题,都会先跑一遍正常的流程,把日志存下来当「对照组」。

避坑指南

我曾经犯过一个低级错误:在 Windows 上直接双击 Chrome 图标,然后以为日志已经开启了。结果折腾了半天,日志文件里啥也没有。后来才发现,--enable-logging 必须在命令行启动时带上,双击图标是不会加载这些参数的。

还有一次,我忘了加 --v=1,默认的日志级别是 0,只输出 fatal 级别的错误。结果日志文件只有几行,根本看不出问题。嗯,从那以后我每次启动都会检查一下命令行参数。

总结一下: 日志调试是 WebRTC 开发者的基本功。别怕日志文件大,学会过滤和对比,你就能从海量信息中快速找到线索。下次遇到黑屏、卡顿、连不上,别急着改代码,先开日志看看。

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