【问题标题】:Using functions with structures within structures (libusb)在结构中使用带有结构的函数 (libusb)
【发布时间】: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 数组,而不是在结构中使用它;有效。但这只是为了检查,我现在必须在我的结构中使用它。

标签: c pointers struct libusb


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 2020-09-01
    • 1970-01-01
    • 2014-06-11
    相关资源
    最近更新 更多