将函数与结构中的结构一起使用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("\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

到目前为止,我已经尝试了很多方法解决问题,但是没有成功。如果您有任何想法...

解决方法

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

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));