crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> libusb вылетает программа, если устройство отключено
MishaUA
  опции профиля:
сообщение 17.5.2013, 1:43
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Раньше писал в билдере, там для общения с usb устройствами использовал библиотеку usblib-win32. Так как пересел на Qt, я переписал библиотеку под него (только изменил загрузку libusb0.dll), работает не плохо, но если устройство отключено, то при вызове "_usb_control_msg", которая содержится в той dll, программа завершается. В билдере, в данном случае, функция просто висела до выхода установленного таймаута.
Что мне можно сделать в данном случае? (кроме возвращения в билдер)
PS: загрузку dll сделал так:
  QLibrary libusb_dll(LIBUSB_DLL_NAME);
  if(!libusb_dll.load()) return;
  _usb_open = (usb_open_t) libusb_dll.resolve("usb_open");
  _usb_close = (usb_close_t) libusb_dll.resolve("usb_close");
// и далее так само остальные функции
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2013, 3:29
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


надо попробовать под отладчиком посмотреть стек вызовов при аварийном завершении.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 17.5.2013, 9:22
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


эм... Если не затруднит, напишите, пожалуйста, что именно надо сделать?
Я запускал через отладчик, после вылета программы указатель стоял на _usb_control_msg
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.5.2013, 12:48
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


если ты используешь компилятор GCC, то его же отладчиком воспользуйся:
gdb.exe myprogram.exe
затем набери в консоли gdb:
>run

как программа упадёт набери в консоли gdb:
>backtrace

он напечатает тебе стек вызовов, ну а ты его сюда прилепи, посмотреть
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 17.5.2013, 13:09
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


ммм, а если MinGW 4.7?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 17.5.2013, 23:58
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


упс, сорри, я затупил))))
Вот стек вызовов (из Qt Creator):
Цитата
0 usb_control_msg C:\Windows\system32\libusb0.dll 0x72124070
1 usb_control_msg usb.cpp 294 0x403dab
2 usb_lib::getReport usb_lib.cpp 31 0x40351e
3 MainWindow::timerUSB mainwindow.cpp 107 0x402948
4 MainWindow::qt_static_metacall moc_mainwindow.cpp 73 0x404b22
5 QMetaObject::activate qobject.cpp 3445 0x6b97d5e5
6 QMetaObject::activate qobject.cpp 3320 0x6b97cde2
7 QTimer::timeout moc_qtimer.cpp 189 0x6b9f15a4
8 QTimer::timerEvent qtimer.cpp 250 0x6b982378
9 QObject::event qobject.cpp 1051 0x6b9758eb
10 QApplicationPrivate::notify_helper qapplication.cpp 3398 0x9bdaf5
11 QApplication::notify qapplication.cpp 2829 0x9bb45e
12 QCoreApplication::notifyInternal qcoreapplication.cpp 767 0x6b9490a6
13 QCoreApplication::sendEvent qcoreapplication.h 203 0x6ba17d1f
14 QEventDispatcherWin32Private::sendTimerEvent qeventdispatcher_win.cpp 572 0x6b9a3b74
15 qt_internal_proc qeventdispatcher_win.cpp 426 0x6b9a31f1
16 USER32!IsWindowVisible C:\Windows\system32\user32.dll 0x774486ef
17 ?? 0x132222
18 ?? 0x113
19 ?? 0x5
20 ??
... <Более>

При завершении программы указатель был на второй строчке

PS: вот usb.cpp:
int usb_control_msg(usb_dev_handle *dev, int requesttype, int request,
                    int value, int index, char *bytes, int size,
                    int timeout)
{
  if(_usb_control_msg)
    return _usb_control_msg(dev, requesttype, request, value, index, bytes,
                            size, timeout);          ///////// ЭТО 294 строка, на которой остановилась программа
  else
    return -ENOFILE;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MishaUA
  опции профиля:
сообщение 18.5.2013, 3:01
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 185
Регистрация: 28.4.2013
Пользователь №: 3810

Спасибо сказали: 13 раз(а)




Репутация:   0  


Проблема решилась (да и была совсем в другом месте)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.5.2013, 3:40
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


а как завязана с функцией usb_control_msg?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.1.2025, 5:21