You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Win7 64位下libusb_claim_interface触发SIGSEGV段错误求助

我之前也碰到过类似MinGW下libusb操作HID复合设备触发段错误的问题,结合你的场景,大概率是这几个原因导致的,咱们一步步排查:

可能的原因与解决方案

1. 设备列表操作不规范导致野指针

看你代码片段里的libusb_get_device_list(NULL, &am...,应该是&devs吧?如果没正确获取设备列表,或者后续没释放列表资源,很容易出现野指针访问触发段错误。

修复建议:
严格遵循设备列表的生命周期流程:

int cnt = libusb_get_device_list(NULL, &devs);
if (cnt < 0) {
    libusb_exit(NULL);
    return cnt;
}

// 遍历设备找到目标设备后,务必释放列表
libusb_free_device_list(devs, 1); // 第二个参数传1表示同时取消引用设备对象

2. MinGW与libusb的HID驱动兼容性冲突

MinGW64环境下,默认的系统HID驱动和libusb的适配容易出问题,尤其是复合设备的多接口场景,权限或资源竞争会引发诡异的段错误。

修复建议:

  • 用Zadig工具给你的第二个自定义HID接口安装libusbK驱动,替换系统默认的HID驱动,确保libusb能完全接管该接口;
  • 确认你用的libusb是针对MinGW64编译的版本,别混用MSVC编译的库——ABI不兼容会导致各种内存访问错误。

3. 未正确声明目标接口就操作

复合设备需要明确打开并声明要操作的接口,直接操作设备而不处理接口权限,会触发内存访问异常。

修复建议:
找到目标设备后,先打开设备,再声明目标接口(第二个接口的编号一般是1):

libusb_device_handle *handle = NULL;
int r = libusb_open(dev, &handle);
if (r < 0) {
    // 错误处理逻辑
    return r;
}

// 声明第二个自定义HID接口
r = libusb_claim_interface(handle, 1);
if (r < 0) {
    libusb_close(handle);
    // 错误处理逻辑
    return r;
}

// 在这里执行读写等操作
// ...

// 操作完成后释放接口并关闭设备
libusb_release_interface(handle, 1);
libusb_close(handle);

4. 未正确获取设备描述符就访问字段

你的代码里定义了struct libusb_device_descriptor desc;,如果没调用libusb_get_device_descriptor(dev, &desc)就直接访问desc的字段,也会触发段错误。

修复建议:
遍历设备时先获取描述符,确认是目标设备再操作:

for (i = 0; i < cnt; i++) {
    dev = devs[i];
    int r = libusb_get_device_descriptor(dev, &desc);
    if (r < 0) {
        continue;
    }
    // 匹配你的设备VID和PID
    if (desc.idVendor == YOUR_DEVICE_VID && desc.idProduct == YOUR_DEVICE_PID) {
        // 找到目标设备,执行后续逻辑
        break;
    }
}

内容的提问来源于stack exchange,提问作者Сергей Клеменов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:49:50