libusb : erreur avec MacOS 10.4 sous Intel

  • Créateur du sujet Créateur du sujet Sunsheida
  • Date de début Date de début
A

Anonyme

Invité
Bonjour, je voudrais compiler avec Xcode un programme qui utilise la librairie "libusb" que j'ai réussi à installer, mais lors de l'éxecution sous MacOS 10.4.7 Intel (le problème ne se posant pas sous Linux), le programme m'affiche le message "Bus error", quelqu'un a-t-il une solution à mon problème ? Par avance, merci.:)
 
Bonsoir et bienvenue sur MacGé' :)

Je suis assez dubitatif quant à ton problème. Tu aurais installé un librairie "libusb" ?

A ma connaissance, l'accès aux périphériques USB sous Mac OS X utilise le framework IOKit.

D'où sort cette librairie "libusb" ?

Je peux me tromper, mais il est très possible que tu cherches à utiliser une librairie qui n'est pas compatible avec Mac OS X.

Euuuh ... On serait pas mieux dans le forum "Développements, là ? Si, un peu, hein !
 
Salut, je suis ravi d'appartenir à cette belle communauté Mac, effectivement la question aurait dù être posée dans la section "developpement", je me suis trompé:D. Concernant mon problème, certaines personnes témoignent du bon fonctionnement de cette librairie "libusb". J'ai d'ailleurs le lien pour la télécharger en Sdk et Bin (Je ne connais pas la différence mais bon) spécialement pour MacOS X :

http://www.ellert.se/twain-sane/

Mais merci pour cette piste...

P.S: si quelqu'un d'autre a une solution pour résoudre le message d'erreur "Bus error" lié à l'utilisation de cette librairie "libusb", je suis tout ouïe :D
 
Ça semble bien être fait pour Mac OS X.


As-tu une idée de la partie du code qui a généré l'erreur ?

Je viens de regarder dans les sources de "libusb" dont tu parles, et je n'ai pas trouvé de message contenant "Bus error".
 
"bus error" correspond au "segmentation fault" de Linux ou Windows.
En gros ça signifie que l'on tente d'écrire dans une zone mémoire interdite (le plus souvent).

J'ai tenté de débugguer le programme avec GDB.
La ligne qui pose problème est la suivante:
Bloc de code:
retval=usb_bulk_read(ifmidi_handle, 0x81, buffer, 64, 100);

buffer étant un tableau de 64 cases. Cette ligne fonctionne sous Linux.

GDB me sort une erreur détaillée au moment de l'exécution de cette ligne:
Bloc de code:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x0166a196 in usb_bulk_read (dev=0x302220, ep=129, bytes=0xbffffaa4 "?#", size=64, timeout=100) at darwin.c:907
907       device = dev->impl_info;
 
Qu'entends tu par "bien alloué"? Je l'ai déclaré dans la même fonction.

Sa taille est suffisante. J'ai essayé de l'agrandir mais ça ne change rien, théoriquement il n'y a que 64 octets à y stocker.
 
Par acquis de conscience (juste pour faire un essai), pourrais-tu mettre ce tampon ailleurs (sur le tas, en l'allouant dynamiquement ou en le déclarant en variable globale) ?

C'est juste pour voir s'il n'y aurait pas un écrasement de la mémoire du fait de l'appel de la fonction "usb_bulk_read".
 
Sunsheida a dit:
"bus error" correspond au "segmentation fault" de Linux ou Windows.
En gros ça signifie que l'on tente d'écrire dans une zone mémoire interdite (le plus souvent).

J'ai tenté de débugguer le programme avec GDB.
La ligne qui pose problème est la suivante:
Bloc de code:
retval=usb_bulk_read(ifmidi_handle, 0x81, buffer, 64, 100);
buffer étant un tableau de 64 cases. Cette ligne fonctionne sous Linux.

GDB me sort une erreur détaillée au moment de l'exécution de cette ligne:
Bloc de code:
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_PROTECTION_FAILURE at address: 0x00000000
0x0166a196 in usb_bulk_read (dev=0x302220, ep=129, bytes=0xbffffaa4 "?#", size=64, timeout=100) at darwin.c:907
907       device = dev->impl_info;
envoie malloc help et tourne ton programme pour voir ce qu'il se passe
et fait des break point à mon avis c'est une erreur de buffer

repporte le probleme au mainteneur de cette lib :zen:
if (signal(SIGBUS,my_callback_function) == SIG_ERR )
printf("SIGBUS %i\n",SIGINT); /* for C */

le deuxieme argument ? ca sert a quoi ?

en passant tu as le log de ton configure et make ?

Bloc de code:
int result;
  rw_async_to_func_t to_func = NULL;
  struct darwin_dev_handle *device;
  
  if (dev == NULL || dev->impl_info == NULL)
    return -EINVAL;

  ep |= 0x80;
  
  device = dev->impl_info;
test le sizeof de usb_dev_handle

a mon avis c'est la struct que tu envoies qui a un probleme

et donne une taille a
struct darwin_dev_handle qui soit equivalente a usb_dev_handle

cela pourrait aider

je viens de la compiler et tous les binaires test fonctionnent

Dev #0: 05AC - 8005
Dev #0: 05AC - 8005
Dev #0: Mitsumi Electric - Hub in Apple Extended USB Keyboard
Dev #0: Mitsumi Electric - Apple Extended USB Keyboard
Dev #0: Macally - Macally USB Optical Net Mouse
 
  • J’aime
Réactions: p4bl0