如何用libusb模拟USB热插拔移除事件?(测试与调试)
模拟USB热插拔移除事件测试libusb应用的实操方案
一、本地手动测试方案
Linux平台
usbip远程设备模拟
找一台闲置Linux机器作为USB服务器,导出闲置USB设备:# bus-id通过lsusb查询,格式如1-2 usbip bind -b 1-2 # 启动usbip服务 sudo systemctl start usbipd在测试机器上挂载该远程设备:
usbip attach -r <服务器IP> -b 1-2模拟移除时,断开连接触发热插拔事件:
# 先通过usbip list -l查询端口号,如001 usbip detach -p 001dummy_hcd虚拟USB设备
加载内核模块创建虚拟USB控制器:sudo modprobe dummy_hcd系统生成虚拟USB设备后,执行以下命令模拟移除:
# 设备路径通过lsusb查询,如/sys/bus/usb/drivers/dummy_hcd/1-1 echo 1 > /sys/bus/usb/drivers/dummy_hcd/unbind
macOS平台
磁盘镜像模拟USB驱动器
创建虚拟磁盘镜像:hdiutil create -size 100m -fs HFS+ -volname "TestUSB" test.dmg挂载后,libusb可识别对应的虚拟USB存储设备:
hdiutil attach test.dmg模拟移除时卸载镜像触发事件:
hdiutil detach /Volumes/TestUSBIOKit虚拟USB设备
编写简单命令行工具调用IOKit API创建虚拟USB设备,之后通过IOServiceTerminate注销设备服务,直接触发libusb的热插拔回调。
二、自动化测试(GitHub共享运行器场景)
核心方案:Mock libusb API(单元测试首选)
直接在测试代码中Mock libusb关键API,无需依赖真实USB设备:
- 用测试框架(如Google Test、Catch2)替换
libusb_hotplug_register_callback,保存应用注册的回调函数 - 测试移除事件时,手动调用该回调函数,传入
LIBUSB_HOTPLUG_EVENT_DEVICE_LEFT事件和模拟的设备句柄 - 验证应用执行回调后的状态(如资源清理是否完成、日志输出是否符合预期)
Linux运行器实操
在GitHub Linux Runner上预装usbip,配合dummy_hcd做集成测试:
# 加载虚拟USB模块 sudo modprobe dummy_hcd # 绑定并导出虚拟设备 bus_id=$(lsusb | grep dummy | awk '{print $2"-"$4}' | sed 's/:$//') usbip bind -b $bus_id sudo systemctl start usbipd # 本地挂载虚拟设备 usbip attach -r 127.0.0.1 -b $bus_id # 启动应用监听后,执行移除操作 port=$(usbip list -l | grep $bus_id | awk '{print $1}' | sed 's/^.*://') usbip detach -p $port # 验证应用响应是否正确
macOS MacStadium运行器实操
用hdiutil做集成测试,步骤简单且无需额外权限:
# 创建并挂载虚拟磁盘 hdiutil create -size 100m -fs HFS+ -volname "TestUSB" test.dmg hdiutil attach test.dmg # 启动应用后触发移除 hdiutil detach /Volumes/TestUSB # 验证应用是否正确处理事件
三、关键注意事项
- 确保应用的
libusb_handle_events事件循环正常运行,否则热插拔回调无法触发 - Mock API适合单元测试,模拟真实设备的方案更贴近生产环境,适合集成测试
- GitHub运行器上执行内核相关操作需要sudo权限,macOS部分操作已由共享运行器预设配置
内容的提问来源于stack exchange,提问作者Michael Altfield
相关产品推荐
相关产品推荐

