AirPlay 投屏设备发现稳定性:mDNS 缓存一致性问题定位与修复

背景 APlayReceiver 是 APlay 项目里的 Linux AirPlay/RAOP 接收端。Apple 设备发现 AirPlay 接收端依赖 Bonjour,也就是 mDNS + DNS-SD。 这次问题的现象是: 昨天 Apple 设备可以发现 APlayReceiver。 晚上设备自动休眠,没有关机,第二天 Apple 设备的投屏设备列表…

Wireshark 分析 AirPlay 投屏

背景 在调试 AirPlay 投屏接收端时,最容易遇到一个反直觉现象:接收端日志里明明已经收到了 SETUP、RECORD、SET_PARAMETER 等 RTSP 请求,但 Wireshark 里使用下面的``rtsp`显示过滤器却是空的: 这很容易让人怀疑: 是不是根本没有抓到 RTSP? 是不是 AirPlay 使用的不是标准 RTSP? 日志中为什…

AirPlay mDNS 双栈发现:A 和 AAAA 到底该怎么发

背景 在把 UxPlay 的 DNS-SD/Avahi 依赖替换为内置 mDNS responder 时,PR review 里出现了一个很典型的双栈问题: 使用内置 mdnsd 时,AirPlay 客户端会先建立一个 IPv4 TCP 连接,然后很快又建立一个 IPv6 TCP 连接,前一个 IPv4 连接被替换;使用 Avahi 时,只看到 IPv6…

xdebug:一个面向跨平台 Native 服务的 TCP 调试入口

很多 Native 服务一旦跑起来,最难处理的不是"有没有日志",而是"我现在能不能在不中断进程的情况下问它几个问题"。 比如一个投屏服务、音视频服务或嵌入式后台任务,现场经常需要临时确认: 当前模块是否还活着。 编码器参数是否按预期生效。 某个状态机卡在哪一步。 是否可以临时触发一次 IDR、刷新、重连或 dump。 日志之外的运行时状态能不能直接读出…

一切皆文件,epoll 事件驱动编程与实用技巧

epoll 经常被介绍成"高性能网络 I/O 多路复用接口",这句话没错,但它只讲了最常见的一半用法。 在真实工程里,epoll 更像一个统一的事件入口。网络读写、退出通知、信号处理等事件都可以汇入同一个 wait 点,主线程只需要围绕这个 wait 点做分发,而不必在多个阻塞点和轮询逻辑之间来回切换。 这篇文章会围绕 Linux "一切皆文件" 的设计思想…

C++ 崩溃栈回溯:从原理到工具,手把手教你看懂 crash

一、问题背景 C++ 程序线上崩溃时,最常见的日志可能只有一句: Segmentation fault (11) 这句话只告诉我们程序收到了 SIGSEGV,也就是访问了不该访问的内存。但它没有告诉我们: 崩溃发生在哪个函数。 这个函数是谁调用的。 对应源码文件和行号是什么。 线上 release 二进制被 strip 后还能不能还原现场。 crasht…

segfault 问题分析

本文结合过往项目经验,介绍了内存分段管理的起源,总结了一下遇到 segmentation fault 问题时如何调试。 关于段 段的含义 A segment, in the 8086/8088 is a 64kb chunk of memory addressable by any particular value in a segment registe…

OOM 问题分析

最近在开发一款流媒体后视镜产品,发现触摸设备不响应触控事件,画面冻住不动,串口日志提示 Out of memory。而 release 版本看门狗程序未被注释(进入了编译分支),APP 进程因为 OOM 被 kill,无法及时喂狗,导致系统不断重启。 OOM 的主要场景: 开机 OOM。 视频回放时 OOM。 主要现象: Linux App 进程被 ki…