# libusb : erreur avec MacOS 10.4 sous Intel



## Anonyme (26 Août 2006)

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.


----------



## PA5CAL (26 Août 2006)

Bonsoir et bienvenue sur MacG&#233;' 

Je suis assez dubitatif quant &#224; ton probl&#232;me. Tu aurais install&#233; un librairie "libusb" ?

A ma connaissance, l'acc&#232;s aux p&#233;riph&#233;riques USB sous Mac OS X utilise le framework IOKit.

D'o&#249; sort cette librairie "libusb" ?

Je peux me tromper, mais il est tr&#232;s possible que tu cherches &#224; utiliser une librairie qui n'est pas compatible avec Mac OS X.

Euuuh ... On serait pas mieux dans le forum "D&#233;veloppements, l&#224; ? Si, un peu, hein !


----------



## Anonyme (26 Août 2006)

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é. 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


----------



## PA5CAL (26 Août 2006)

Ç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".


----------



## Anonyme (26 Août 2006)

"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:

```
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:

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


----------



## PA5CAL (26 Août 2006)

Le tampon "buffer" est-il bien alloué au moment du remplissage, et de taille suffisante ?


----------



## Anonyme (26 Août 2006)

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.


----------



## PA5CAL (26 Août 2006)

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".


----------



## tatouille (31 Août 2006)

Sunsheida a dit:
			
		

> "bus error" correspond au "segmentation fault" de Linux ou Windows.
> En gros &#231;a signifie que l'on tente d'&#233;crire dans une zone m&#233;moire interdite (le plus souvent).
> 
> J'ai tent&#233; de d&#233;bugguer le programme avec GDB.
> ...


envoie malloc help et tourne ton programme pour voir ce qu'il se passe 
et fait des break point &#224; mon avis c'est une erreur de buffer

repporte le probleme au mainteneur de cette lib 
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 ?


```
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


----------

