问题描述
使用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;
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));