usb library fails on Windows
|Reported by:||basvandijk||Owned by:||simonmar|
|Keywords:||Cc:||Joris Putcuyps <joris.putcuyps@…>, John Obbele <john.obbele@…>, Maurício Antunes <mauricio.antunes@…>|
|Type of failure:||Runtime crash||Test Case:|
|Related Tickets:||Differential Rev(s):|
I'm trying to get my Haskell
usb library to work on Windows. I currently get a weird error. Please follow the steps below to reproduce the error:
- Download libusb for Windows and extract it somewhere e.g.
(Important build-time files:
(Important run-time files:
- Download, unpack and cabal install the, as of yet unreleased, bindings-DSL-1.0.12
(This version lets you use the right calling convention on Windows (
ccall) by configuring cabal with
git clone git://github.com/basvandijk/bindings-libusb.git cd bindings-libusb
Make sure to checkout the
windowsbranch and let cabal know where to find
libusb:git checkout windows cabal install --extra-include-dirs="C:\Program Files\libusb\libusb1\include\libusb-1.0" --extra-lib-dirs="C:\Program Files\libusb\libusb1\MinGW32\dll"
- Clone the
git clone git://github.com/basvandijk/usb.git cd usbThere's no need to install the library. I included an example program that will demonstrate the error:
cabal configure --flags="example -library" cabal build
The example should read some bytes of an attached USB mouse (change the VID and PID to match your mouse). However it gives two errors:
dist\build\example\example.exe example.exe: NotFoundException Segmentation fault/access violation in generated code
This bug report is about the segmentation fault.
NotFoundException is thrown by
which is indirectly called by
getDevices. According to the
this error is thrown when the specified configuration doesn't
exists. Since I only call this function on existing configurations
this seems like a bug in libusb. I will dive in the libusb source code to see what is going on.
Segmentation fault/access violation in generated code is caused
by the finalizer in
newCtx ∷ IO Ctx newCtx = newCtxNoEventManager Ctx libusb_init ∷ IO (Ptr C'libusb_context) libusb_init = alloca $ \ctxPtrPtr → do handleUSBException $ c'libusb_init ctxPtrPtr peek ctxPtrPtr newCtxNoEventManager ∷ (ForeignPtr C'libusb_context → Ctx) → IO Ctx newCtxNoEventManager ctx = mask_ $ do ctxPtr ← libusb_init ctx <$> newForeignPtr p'libusb_exit ctxPtr
p'libusb_exit is called the segmentation fault occurs.
Note that the error disappears when I change that last line with:
ctx <$> Foreign.Concurrent.newForeignPtr ctxPtr (c'libusb_exit ctxPtr)
I previously got the exact same segmentation fault when calling other
bindings-libusb functions. This was caused by using the wrong calling convention on Windows. I used
ccall but had to use
stdcall. So I assume the current segmentation fault has something to do with the calling convention of
Any ideas what is causing this? I would really like to solve it. It's the last step before releasing