c-在结构中使用具有结构的函数(libusb)



我在使用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("n33[0;31m error getting config while trying to connect %s n33[0m", libusb_error_name(error));
return 1;
}
if(config != 1)
{
libusb_set_configuration(battery_data->handle, 1);
if (error != 0) {
printf("n33[0;31m error setting config while trying to connect n33[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 '01', 
list_device=0x55555576d990, battery_data_list=0x7fffffffdd50) at main.c:209
#3  0x0000555555555151 in main () at main.c:50

到目前为止,我尝试了很多方法来解决这个问题,但都没有奏效。如果你有什么想法。。。

至少这个问题是:大小分配错误。

battery_data_element->device_handled = malloc(sizeof(libusb_device*)); 
//                                                   ^^^^^^^^^^^^^^ wrong 
// Wrong size here too.
battery_data_element->handle = malloc(sizeof(libusb_device_handle*));

避免在尝试用正确的类型进行编码时出错。分配到引用数据的大小。p = malloc(sizeof *p);更易于正确编码、审查和维护。

battery_data_element->device_handled = 
malloc(sizeof *(battery_data_element->device_handled));

最新更新