Я пишу программу захвата камеры, которая использует libusb 1.0 и cImg. Он подключается к моей астрономической камере Atik 314L и делает снимки. для отображения на экране. Он отлично компилируется при компиляции под обычным пользователем или суперпользователем и хорошо работает при выполнении под пользователем root, но генерирует ошибку сегментации при запуске любым другим способом.
Я использую Code::Blocks, и стек вызовов показывает, что сегментация Ошибка возникает при вызове функции usb_control_msg()
:
#0 (usb_control_msg(dev=0x0, requesttype=64, request=160, value=58880, index=0 bytes=0x7fffffffe5df "\001 \346\377\377\377\177", size=1, timeout=500) (linux.c:152)
Я новичок в программировании в среде Linux, и я не знаю, что делать, чтобы это работало для обычных пользователей. Вот шаги, которые я пробовал до сих пор:
- Добавьте моего пользователя во все группы пользователей, чтобы узнать, не связана ли проблема с правами группы (черт возьми, я даже пытался добавить себя в «root», но это ничего не дало)
- Добавьте в
/etc/udev/rules.d
правило примерно такого содержания: PROGRAM="/home/[username]/git/camera/prog", MODE="0660", GROUP="camera" - Попробуйте изменить разрешения самой программы на 777. Это была последняя попытка - я действительно не ожидал, что это сработает.
Я учусь отлаживать по ходу работы, поэтому, если вам нужны журналы или что-то еще, чтобы увидеть, что не так, просто дайте мне знать.
libusb_open();
где-нибудь в коде? Если вы сделаете это (для целей отладки), это должно дать вамLIBUSB_ERROR_ACCESS
. Позже вы можете добавить своего пользователя в группу «root», что должно дать вам доступ ко всем USB-устройствам и uinput. Вот как вы можете отлаживать, если это проблема, связанная с доступом. - person   schedule 22.06.2013/libusb-0.1.12/linux.c
: ее вызываетret = ioctl(dev->fd, IOCTL_USB_CONTROL, &ctrl);
. Есть идеи, почему? - person user2224491   schedule 12.07.2013/libusb-0.1.12/linux.c
:ret = ioctl(dev->fd, IOCTL_USB_CONTROL, &ctrl);
вызывает ее, но я не уверен, как ее отлаживать. Что я вижу, так это то, что функция ioctl передает разыменованную переменную-член, определенную вещь и переменную, которая была передана по ссылке. Я просмотрел файлioctl.h
, чтобы увидеть, как работает функция, но он мало что мне сказал, а когда я попытался найти реализацию ioctl, Code::Blocks сказал мне, что она не найдена, но я думаю, что это потому, что .c файл не включен в мой проект. - person user2224491   schedule 12.07.2013<sys/ioctl.h>
- person   schedule 15.07.2013