【发布时间】:2020-10-20 08:27:05
【问题描述】:
我在使用 libusb 连接设备时遇到问题。我认为问题可能出在我使用结构的方式或内存分配上。我正在尝试在我的结构中打开一个带有 libusb 结构的设备:
struct battery_data {
libusb_device *device_handled;
libusb_device_handle *handle;
int voltage;
int current;
int capacity;
int mode;
int ident;
uint8_t port[8];
};
typedef struct battery_data battery_data;
我认为导致错误的 libusb 函数:
int libusb_open ( libusb_device * dev, libusb_device_handle ** dev_handle );
我的功能:
libusb_context *ctx = NULL;
int handler_pos = 0;
int USB_connect(char verbosity, libusb_device **list_device, battery_data *battery_data_list[20])
{
int connect, i;
cnt = libusb_get_device_list(NULL, &list_device); // list of devices plugged
for (i = 0; i < cnt; i++){ //going through every devices
connect = USB_connect_device(list_device[i], battery_data_list[handler_pos]);
}
return 0;
}
int USB_connect_device(libusb_device *list_device, battery_data *battery_data)
{
int j, error;
int config;
struct libusb_device_descriptor desc;
libusb_get_device_descriptor(list_device, &desc);
if(desc.idVendor == 0x0483 && desc.idProduct == 0x5740) //check if the device interests us
{
battery_data_element = malloc(sizeof(battery_data));
battery_data_element->device_handled = malloc(sizeof(libusb_device*));
battery_data_element->handle = malloc(sizeof(libusb_device_handle*));
error = libusb_open(list_device, &battery_data->handle); //SEGFAULT Here
battery_data->device_handled = list_device;
if(error != 0){fprintf(logfile, "\nerror opening device while trying to connect %s \n", libusb_error_name(error));}
else{
error = libusb_get_configuration(battery_data->handle, &config);
if(error != 0){
printf("\n\033[0;31m error getting config while trying to connect %s \n\033[0m", libusb_error_name(error));
return 1;
}
if(config != 1)
{
libusb_set_configuration(battery_data->handle, 1);
if (error != 0) {
printf("\n\033[0;31m error setting config while trying to connect \n\033[0m");
return 1;
}
else {
printf("\n device now configured");
}
}
if(libusb_kernel_driver_active(battery_data->handle,0) == 1){ //determine if a driver is active
printf("\nKernel driver active");
if (libusb_detach_kernel_driver(battery_data->handle, 0) == 0){ //if it is, detach it to be able to claim it
printf("\n kernel driver detached");
}
else {
}
}
error = libusb_claim_interface(battery_data->handle, 0); //claim an interface on a device handle to perform I/O
if (error != 0){return 1;}
handler_pos++ //increment number if device if everything is fine
}
}
return 0;
}
返回错误:
Thread 1 "main" received signal SIGSEGV, Segmentation fault.
0x00007ffff7bc1fcd in libusb_open () from /lib/x86_64-linux-gnu/libusb-1.0.so.0
(gdb) backtrace
#0 0x00007ffff7bc1fcd in libusb_open ()
from /lib/x86_64-linux-gnu/libusb-1.0.so.0
#1 0x0000555555555798 in USB_connect_device (list_device=0x5555557733f0,
battery_data=0x0) at main.c:230
#2 0x00005555555556a6 in USB_connect (verbosity=1 '\001',
list_device=0x55555576d990, battery_data_list=0x7fffffffdd50) at main.c:209
#3 0x0000555555555151 in main () at main.c:50
到目前为止,我尝试了很多方法来解决这个问题,但都没有奏效。如果你有什么想法...
【问题讨论】:
-
什么不起作用?问题是什么?你说的是哪个bug?你尝试了什么?
-
我添加了使用 gdb 时遇到的错误。我认为问题出在我在函数 libusb_open 中使用结构的方式(期望 libusb_device_handle ** dev_handle)或内存分配。我尝试使用 libusb_device 和 libusb_device_handle 数组,而不是在结构中使用它;有效。但这只是为了检查,我现在必须在我的结构中使用它。