From: Stefano A. <san...@al...> - 2010-11-12 09:16:41
|
----- Original Message ----- On 2010/11/12 23:24 Chris Frey wrote: > On Thu, Nov 11, 2010 at 09:11:54PM -0800, Stefano Antonelli wrote: > > libusb_context *context; I removed this. > > handle = libusb_open_device_with_vid_pid (context, > (uint16_t)VID, (uint16_t)PID ); > > context is being used while uninitialized here. Good catch, thanks. I fixed that with this: handle = libusb_open_device_with_vid_pid (NULL, (uint16_t)VID, (uint16_t)PID ); And there still appears to be a leak :( I had intended to simply use the default context, but that code came from a mix of examples. Thanks for catching it. -Stef |
From: Stefano A. <san...@al...> - 2010-11-12 19:02:08
|
----- Original Message ----- On 2010/11/12 10:07 Pete Batard wrote: > I've since identified the issue to be a missing call to _close() when > relinquishing the message pipe handles, which resulted in an fd being > left open after the call to libusb_close(). > Thanks for looking into it. In the near term, if I only open and close the device once, I shouldn't see any bad behaviour on repeated feature report requests? Thanks, Stef |
From: Pete B. <pb...@gm...> - 2010-11-13 00:39:39
|
On 2010.11.12 19:01, Stefano Antonelli wrote: > In the near term, if I only open and close the device once, I shouldn't see any bad behaviour on repeated feature report requests? Yup. As long as you don't call libusb_exit() more than 2044 times, your application should be fine. And once pbr321 is out, you should be able to call libusb_exit() as many times as you want. Most apps would tend to call init/exit outside of a subroutine, especially if that routine is going to be called frequently, as it improves performance. It's a good thing you did it the way you did, as it allowed us to catch that bug. If you encounter any other issues, don't hesitate to let us know. Regards, /Pete |
From: Pete B. <pb...@gm...> - 2010-11-13 21:31:48
|
As promised, pbr321 that fixes the issue: http://libusb.org/wiki/windows_backend#LatestBinarySnapshots Regards, /Pete |
From: Stefano A. <san...@al...> - 2010-11-16 22:14:32
|
> As promised, pbr321 that fixes the issue: > http://libusb.org/wiki/windows_backend#LatestBinarySnapshots I built against this snapshot (pbr321) and the original problem (LIBUSB_NO_MEM) appears to be fixed, but my application still has a memory leak. I haven't seen any error messages, but the working set private bytes (as seen in process explorer) increases over time. Starting WSPrivateBytes: 1116K 1/2hour later WSPrivateBytes: 2320K Again, this function is being called every 300ms. If I comment out the guts of this function, the WSPrivateBytes is constant over time. Am I doing anything obviously stupid here? int MainDialog::GetStatusReport( unsigned char *pBuffer ) { wxString tempstr; libusb_device_handle *handle; int r, bConfigurationValue; int count = -1; int bInterface = 3; int size = 7; int ReportId = 2; // Read from report ID 2 r = libusb_init(NULL); if (r < 0) { m_textCtrl1->AppendText(wxNow()); tempstr.Printf(": libusb_init error: %d (%s)\n", r, libusb_strerror((libusb_error)r)); m_textCtrl1->AppendText(tempstr); goto libusb_init_out; } handle = libusb_open_device_with_vid_pid (NULL, (uint16_t)VID, (uint16_t)PID ); if (handle == NULL) { m_textCtrl1->AppendText(wxNow()); m_textCtrl1->AppendText(": libusb_open_device_with_vid_pid failed to create handle\n"); goto libusb_open_out; } r = libusb_get_configuration(handle, &bConfigurationValue); if (r < 0) { m_textCtrl1->AppendText(wxNow()); tempstr.Printf(": libusb_get_configuration error: %d (%s)\n", r, libusb_strerror((libusb_error)r)); m_textCtrl1->AppendText(tempstr); goto libusb_open_out; } if (bConfigurationValue != 1) { r = libusb_set_configuration(handle, 1); if(r < 0) { m_textCtrl1->AppendText(wxNow()); tempstr.Printf(": libusb_set_configuration error: %d (%s)\n", r, libusb_strerror((libusb_error)r)); m_textCtrl1->AppendText(tempstr); goto libusb_open_out; } } r = libusb_claim_interface(handle, bInterface); if (r < 0) { m_textCtrl1->AppendText(wxNow()); tempstr.Printf(": libusb_claim_interface error: %d (%s)\n", r, libusb_strerror((libusb_error)r)); m_textCtrl1->AppendText(tempstr); goto libusb_claim_interface_out; } r = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE, HID_GET_REPORT, (HID_REPORT_TYPE_FEATURE<<8)|ReportId, 0, pBuffer, (uint16_t)size, 5000); if (r < 0) { m_textCtrl1->AppendText(wxNow()); tempstr.Printf(": libusb_control_transfer error: %d (%s)\n", r, libusb_strerror((libusb_error)r)); m_textCtrl1->AppendText(tempstr); goto libusb_claim_interface_out; } else { count = r; } libusb_claim_interface_out: libusb_release_interface(handle, bInterface); libusb_open_out: libusb_close(handle); libusb_init_out: libusb_exit(NULL); return count; } |
From: Peter S. <pe...@st...> - 2010-11-16 22:17:49
|
Stefano Antonelli wrote: > Again, this function is being called every 300ms. If I comment out > the guts of this function, the WSPrivateBytes is constant over > time. Am I doing anything obviously stupid here? Nope. We need to find the leak. Is there valgrind or another leak checker on Windows? But, you really should move everything before/after _claim/release_interface() out of the function. //Peter |
From: Michael P. <mic...@gm...> - 2010-11-16 22:54:57
|
Peter Stuge wrote: >> Nope. We need to find the leak. Is there valgrind or another leak >> checker on Windows? The one built into MSVC is very good, but the OP is apparently using mingw. According to valgrind's website, "In particular Windows is not under consideration here because porting to it would require so many changes it would almost be a separate project. (However, Valgrind + Wine can be made to work with some effort.) " Stefano Antonelli wrote: >> If I comment out the guts >> of this function, the WSPrivateBytes is constant over time. Am I doing >> anything obviously stupid here? What happens if you comment out all the AppendText() calls? I am not familiar with this particular toolkit, but I would expect that to potentially grow over time as errors occur, and maybe there's something preventing you from seeing it? Regards, Michael |
From: Stefano A. <san...@al...> - 2010-11-16 23:15:34
|
> >> If I comment out the guts > >> of this function, the WSPrivateBytes is constant over time. Am I > >> doing anything obviously stupid here? > > What happens if you comment out all the AppendText() calls? > I am not familiar with this particular toolkit, but I would > expect that to potentially grow over time as errors occur, > and maybe there's something preventing you from seeing it? Well I gave that a try. I removed the calls to AppendText and also the wxString variable. The private bytes still increase. The function has now been reduced to this: int MainDialog::GetStatusReport( unsigned char *pBuffer ) { libusb_device_handle *handle; int r, bConfigurationValue; int count = -1; int bInterface = 3; int size = 7; int ReportId = 2; // Read from report ID 2 r = libusb_init(NULL); if (r < 0) { goto libusb_init_out; } handle = libusb_open_device_with_vid_pid (NULL, (uint16_t)VID, (uint16_t)PID ); if (handle == NULL) { goto libusb_open_out; } r = libusb_get_configuration(handle, &bConfigurationValue); if (r < 0) { goto libusb_open_out; } if (bConfigurationValue != 1) { r = libusb_set_configuration(handle, 1); if(r < 0) { goto libusb_open_out; } } r = libusb_claim_interface(handle, bInterface); if (r < 0) { goto libusb_claim_interface_out; } r = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE, HID_GET_REPORT, (HID_REPORT_TYPE_FEATURE<<8)|ReportId, 0, pBuffer, (uint16_t)size, 5000); if (r < 0) { goto libusb_claim_interface_out; } else { count = r; } libusb_claim_interface_out: libusb_release_interface(handle, bInterface); libusb_open_out: libusb_close(handle); libusb_init_out: libusb_exit(NULL); return count; } |
From: Michael P. <mic...@gm...> - 2010-11-16 23:28:23
|
Stefano Antonelli wrote: >> Well I gave that a try. I removed the calls to AppendText and also the >> wxString variable. The private bytes still increase. Eh, was hoping it was something simple. Well, without any instrumentation, the best I can suggest is start removing the parts from the inside out. I.e., take out the transfer first, and test, then take out the transfer AND the claim, and test, and so on, until all you have left is init/exit. Another thing to try is if you have any transfers that use a different size, see if the rate of the leak changes by doing a different transfer. But it'd be easier if you could find something along the lines of what Peter suggested. Do you have access to MSVC, and, if so, can you get your app to compile in it? If so, one of us can tell you how to work the debug runtime. Regards, Michael |
From: Pete B. <pb...@gm...> - 2010-11-17 00:29:19
|
Hi Stephano, For what is worth, I did run a test that should be very close to yours (just modified your original code to pure C), and I have not seen any memory leaks with an instrumented MSVC. I haven't tested MinGW yet, so I'm gonna try that now. I did see some increase in private bytes usage when I tested with MSVC, but it only occurred during the first few minutes and stabilized after a while. If I were to take a guess, I'd say this could come from OS noticing the fact that we are repeatedly creating and closing threads (because of the timer thread), and allocating more resources for the process after a while as a result. I think I did run my test for about 30 mins as well, and found that after the first 5 minutes or so, the target private bytes reached its peak and everything remained very stable. If there is indeed a leak, measurements on private bytes would need to be taken at regular intervals, but only after the first 5 minutes, and for as long as possible (1 hour would be good), so that we eliminate any potential border effect. Again, after running the test program below for about 30 mins, with MSVC leak detection, I have not seen any reports of allocated memory that wasn't freed properly. The MSVC instrumentation is usually very efficient at detecting memory that wasn't properly freed, so, at least for MSVC, I don't believe there should exist a leak on the libusb functions you call. I will now run a test with MinGW (but without instrumentation), and see what I get. Regards, /Pete ----------------------------------------------------- #include <stdio.h> #include <windows.h> #include <libusb/libusb.h> #define VID 0x0001 #define PID 0x0001 #define REPORT_ID 3 #define REPORT_SIZE 3 #define HID_GET_REPORT 0x01 #define HID_REPORT_TYPE_FEATURE 0x03 int GetStatusReport(unsigned char *pBuffer) { libusb_device_handle *handle; libusb_context *context; int r, bConfigurationValue; int count = -1; int bInterface = 0; int ReportId = REPORT_ID; int size = REPORT_SIZE; r = libusb_init(&context); // libusb_set_debug(context, 4); if (r < 0) { printf("libusb_init error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_init_out; } handle = libusb_open_device_with_vid_pid (context, (uint16_t)VID, (uint16_t)PID ); if (handle == NULL) { printf("libusb_open_device_with_vid_pid failed to create handle\n"); goto libusb_open_out; } r = libusb_get_configuration(handle, &bConfigurationValue); if (r < 0) { printf("libusb_get_configuration error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_open_out; } if (bConfigurationValue != 1) { r = libusb_set_configuration(handle, 1); if(r < 0) { printf("libusb_set_configuration error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_open_out; } } r = libusb_claim_interface(handle, bInterface); if (r < 0) { printf("libusb_claim_interface error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_claim_interface_out; } r = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE, HID_GET_REPORT, (HID_REPORT_TYPE_FEATURE<<8)|ReportId, 0, pBuffer, (uint16_t)size, 5000); if (r < 0) { printf("libusb_control_transfer error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_claim_interface_out; } else { count = r; } libusb_claim_interface_out: libusb_release_interface(handle, bInterface); libusb_open_out: libusb_close(handle); libusb_init_out: libusb_exit(context); return count; } int main(int argc, char** argv) { int counter = 0; char buffer[REPORT_SIZE]; while (GetStatusReport(buffer) > 0) { printf("report %d OK\n", counter++); // if (counter > 10000) break; } printf("exited on attempt %d\n", counter); } |
From: Pete B. <pb...@gm...> - 2010-11-17 00:32:55
|
Just to clarify, the MSVC test(s) I ran were done before the release of pbr321 - not as a result of this new issue. /Pete |
From: Stefano A. <san...@al...> - 2010-11-17 00:48:16
|
Pete Batard wrote: > I did see some increase in private bytes usage when I tested > with MSVC, but it only occurred during the first few minutes > and stabilized after a while. If I were to take a guess, I'd > say this could come from OS noticing the fact that we are > repeatedly creating and closing threads (because of the timer > thread), and allocating more resources for the process after > a while as a result. per the email I just sent, I tested each case for a minimum of 10 minutes (again 300ms polling) and noticed around 400kB increase in private bytes. The private bytes increase in a 2 step forwards, 1 step back manner. The number goes up and down by 8kB for a few seconds before it bumps up by 4kB. Then again up and down by 8kB, etc. Seems pretty consistent. Does that sound like the OS is getting involved? > I think I did run my test for about 30 mins as well, and > found that after the first 5 minutes or so, the target > private bytes reached its peak and everything remained very > stable. If there is indeed a leak, measurements on private > bytes would need to be taken at regular intervals, but only > after the first 5 minutes, and for as long as possible (1 > hour would be good), so that we eliminate any potential border effect. Ok, I'll do this and report back. > Again, after running the test program below for about 30 I will try to compile your program with mingw and see if it exhibits the same problem. -Stef |
From: Pete B. <pb...@gm...> - 2010-11-17 01:02:38
|
On 2010.11.17 00:48, Stefano Antonelli wrote: > I will try to compile your program with mingw and see if it exhibits the > same problem. OK. So far this is what I have in MinGW32: 01 1360 02 1428 03 1428 04 1428 05 1592 ^ 06 1592 | 07 1592 | 08 1592 | temporary peaks to 1644K 09 1592 | 10 1592 _ 11 1608 | 12 1608 | 13 1608 | 14 1608 | 15 1608 | temporary peaks to 1660K 16 1608 | 17 1608 | 18 1608 | 19 1608 | 20 1608 | Below is the code I use with minGW32 (the previous one had no 300 ms delay within the loop and did not use NULL for the context). Regards, /Pete ------------------------------------------------------------- #include <stdio.h> #include <windows.h> #include <libusb/libusb.h> #include <unistd.h> #define VID 0x0001 #define PID 0x0001 #define REPORT_ID 3 #define REPORT_SIZE 3 #define HID_GET_REPORT 0x01 #define HID_REPORT_TYPE_FEATURE 0x03 int GetStatusReport(unsigned char *pBuffer) { libusb_device_handle *handle; int r, bConfigurationValue; int count = -1; int bInterface = 0; int ReportId = REPORT_ID; int size = REPORT_SIZE; r = libusb_init(NULL); // libusb_set_debug(NULL, 4); if (r < 0) { printf("libusb_init error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_init_out; } handle = libusb_open_device_with_vid_pid (NULL, (uint16_t)VID, (uint16_t)PID ); if (handle == NULL) { printf("libusb_open_device_with_vid_pid failed to create handle\n"); goto libusb_open_out; } r = libusb_get_configuration(handle, &bConfigurationValue); if (r < 0) { printf("libusb_get_configuration error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_open_out; } if (bConfigurationValue != 1) { r = libusb_set_configuration(handle, 1); if(r < 0) { printf("libusb_set_configuration error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_open_out; } } r = libusb_claim_interface(handle, bInterface); if (r < 0) { printf("libusb_claim_interface error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_claim_interface_out; } r = libusb_control_transfer(handle, LIBUSB_ENDPOINT_IN|LIBUSB_REQUEST_TYPE_CLASS|LIBUSB_RECIPIENT_INTERFACE, HID_GET_REPORT, (HID_REPORT_TYPE_FEATURE<<8)|ReportId, 0, pBuffer, (uint16_t)size, 5000); if (r < 0) { printf("libusb_control_transfer error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_claim_interface_out; } else { count = r; } libusb_claim_interface_out: libusb_release_interface(handle, bInterface); libusb_open_out: libusb_close(handle); libusb_init_out: libusb_exit(NULL); return count; } int main(int argc, char** argv) { int counter = 0; char buffer[REPORT_SIZE]; while (GetStatusReport(buffer) > 0) { printf("report %d OK\n", counter++); // if (counter > 10000) break; usleep(300000); } printf("exited on attempt %d\n", counter); } |
From: Pete B. <pb...@gm...> - 2010-11-17 01:33:49
|
OK, here are my results with MinGW32 on Windows 7 x64 1. loop with a 300 ms sleep delay mins priv(KB) 01 1360 02 1428 03 1428 04 1428 05 1592 ^ 06 1592 | 07 1592 | 08 1592 | temporary peaks to 1644 09 1592 | 10 1592 _ 11 1608 | 12 1608 | 13 1608 | 14 1608 | 15 1608 | temporary peaks to 1660 16 1608 | 17 1608 | 18 1608 | 19 1608 _ (+300 KB around sample 4000) 20 1924 | 21 1924 | 22 1924 | 23 1924 | 24 1924 | 25 1924 | temporary peaks to 1976 26 1924 | 27 1924 | 28 1924 | 29 1924 | 30 1924 _ ~6000 samples in all 2. loop with a 1 ms sleep delay mins priv(KB) 01 1500 02 1608 03 1676 (+300 KB around sample 4000) 04 1992 ^ 05 1992 | 06 1992 | 07 1992 | 08 1992 | 09 1992 | 10 1992 | temporary drops to 1940K 11 1992 | 12 1992 | 13 1992 | 14 1992 | 15 1992 | 16 1992 I'm about 24000 samples in for the 1 ms delay app, and I don't see much that looks like a leakage. With a shorter delay, I'd expect a much more apparent leak. I'll leave the app running some more, but it looks pretty inconclusive to me. The increases we see at the beginning are more likely to be coming from the OS than libusb, IMO. Regards, /Pete |
From: Pete B. <pb...@gm...> - 2010-11-17 01:50:15
|
33 mins in with the 1 ms app, with about 50000 reports read - still stable at 1992K. Unless our rate of sampling the device plays a part, I don't believe we have a leak, or at least, not something that can be exposed with the current test. Regards, /Pete |
From: Stefano A. <san...@al...> - 2010-11-17 01:58:13
|
Pete Batard wrote: > OK, here are my results with MinGW32 on Windows 7 x64 I didn't mention it this time around, but I'm on XP using MinGW32. I'll test this stuff later tonight and report my results. Thanks for looking into it. -Stef |
From: Stefano A. <san...@al...> - 2010-11-17 00:36:14
|
> Eh, was hoping it was something simple. Well, without any > instrumentation, the best I can suggest is start removing the > parts from the inside out. > I.e., take out the transfer first, and test, then take out > the transfer AND the claim, and test, and so on, until all > you have left is init/exit. I've narrowed it down to this at least. Similar rate of private byte increase as the full function. If I remove the open/close calls, there is no change in private bytes. int MainDialog::GetStatusReport( unsigned char *pBuffer ) { libusb_device_handle *handle; int r, bConfigurationValue; int count = -1; int bInterface = 3; int size = 7; int ReportId = 2; // Read from report ID 2 r = libusb_init(NULL); if (r < 0) { goto libusb_init_out; } handle = libusb_open_device_with_vid_pid (NULL, (uint16_t)VID, (uint16_t)PID ); if (handle == NULL) { goto libusb_open_out; } libusb_open_out: libusb_close(handle); libusb_init_out: libusb_exit(NULL); return count; } -Stef |
From: Stefano A. <san...@al...> - 2010-11-17 09:27:08
|
Ok, so I compiled a modified version of your c program (listed at the end) and monitored the private bytes. The results are: start 552K 1min 756K 2min 960K 3min 1192K 4min 1372K 5min 1660K 6min 1940K 7min 2240K 8min 2488K 9min 2772K 10min 3108K 11min 3228K 12min 3600K 13min 3820K 14min 4172K 15min 4372K 16min 4580K 17min 4916K 18min 5360K 19min 5420K 28min 7900K 35min 9864K 40min 11004K (>51500 "reads") It would appear that the leak is really a leak, at least on my machine. Maybe it's just my platform (Windows XP) or my version of gcc (3.4.5) or ? >From previous emails, I know that transfers aren't necessary to reproduce this problem, so I did not include them in my test program. It was simply open/close and no "reads". The reason was that I forgot my hardware on my desk at work and had to use a different (similar) product that I happened to have at home. I compiled it with: gcc -o libusb_test.exe libusb_test.c IC:\devel\libusb\libusb_2010.11.13 -LC:\devel\libusb\libusb_2010.11.13\MinGW32\static -lusb-1.0 output was: Warning: .drectve `-aligncomm:"_hires_frequency",3 ' unrecognized Warning: .drectve `-aligncomm:"_hires_ticks_to_ps",3 ' unrecognized Warning: .drectve `-aligncomm:"_autoclaim_lock",2 ' unrecognized Warning: .drectve `-aligncomm:"_timer_tp",2 ' unrecognized Warning: .drectve `-aligncomm:"_htab_size",2 ' unrecognized Warning: .drectve `-aligncomm:"_htab_filled",2' unrecognized Warning: .drectve `-aligncomm:"_poll_fd",5 ' unrecognized Warning: .drectve `-aligncomm:"__poll_fd",5' unrecognized gcc -v gives: Configured with: ../gcc-3.4.5/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.5 (mingw special) As a sanity check I tried compiling with gcc 4.5 which gave no warnings. However, after 10 minutes the private bytes was at 3320k, and appeared to follow the same trend. gcc -v for 4.5: Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/devel/mingw_2010-10-30/bin/../libexec/gcc/mingw32/4.5.0/l to-wrapper.exe Target: mingw32 Configured with: ../gcc-4.5.0/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-werror --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.5.0 (GCC) I also tried to compile with MSVC tonight, but I don't have it "installed" on my system. Instead I just have the cl, link, and friends in a folder with my own .bat file to set the environment variables. It works for compiling wxWidgets, but I can't get the darned thing to spit out an exe for me (I'm sure this has something to do with manifests). Anyways, I'm giving up on MSVC for now. And here's my test program: #include <stdio.h> #include <windows.h> #include <libusb.h> #define VID 0x0BBF #define PID 0x3226 #define REPORT_SIZE 7 int GetStatusReport(unsigned char *pBuffer) { libusb_device_handle *handle; libusb_context *context; int r, bConfigurationValue; int count = -1; int bInterface = 1; r = libusb_init(&context); // libusb_set_debug(context, 4); if (r < 0) { printf("libusb_init error: %d (%s)\n", r, libusb_strerror(r)); goto libusb_init_out; } handle = libusb_open_device_with_vid_pid (context, (uint16_t)VID,(uint16_t)PID ); if (handle == NULL) { printf("libusb_open_device_with_vid_pid failed to create handle\n"); goto libusb_open_out; } libusb_open_out: libusb_close(handle); libusb_init_out: libusb_exit(context); return 1; } int main(int argc, char** argv) { int counter = 0; char buffer[REPORT_SIZE]; while (GetStatusReport(buffer) > 0) { printf("report %d OK\n", counter++); // if (counter > 10000) break; } printf("exited on attempt %d\n", counter); } |
From: Pete B. <pb...@gm...> - 2010-11-17 12:05:11
|
OK, here are my results using the source you attached (just changed VID/PID and REPORT_SIZE), on Windows 7 (32 and 64 bit) and Windows XP (32 bit). First of, compilation information: gcc -o leak.exe leak.c -I ../dailies/2010.11.13/ -L ../dailies/2010.11.13/MinGW32/static/ -lusb-1.0 $ gcc -v Reading specs from e:/mingw/bin/../lib/gcc/mingw32/3.4.5/specs Configured with: ../gcc-3.4.5-20060117-3/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.5 (mingw-vista special r3) The same executable was used for all the platforms. On Windows 7 64, after 78000 reads in more than 30 mins, private bytes remained stable at 1976K, which were reached about 2-3 minutes after the program started On Windows 7 32, after 30000 reads in more than 30 mins (the program is much slower as the CPU is quite old on this machine), private bytes remained stable at 2372K, that were reached in about 3-4 minutes. On Windows XP, after 10000 reads in more than 30 mins (very slow on this old platform, as Windows was also doing a series of updates in the background), private bytes remained stable at 1616K. In fact, of all the platforms, XP was the most stable, as the target was reached very early one (<1 min), and I've not seen it fluctuate after that. And just to confirm, you are using an HID device, and didn't install the WinUSB driver against it, right? Basically, these results leave us with 3 possibilities: 1. Compilation specific issue => I have uploaded a version of your test program (with your VID/PID/REPORT_SIZE values) compiled in my MinGW32 environment. The expectation is that you should still see a leak with it on your platform. You can download it there [1]. 2. Hardware specific issue (eg. on your platform, you have an USB HCD or device that produces a leak during enumeration, while I don't have anything similar on any of my platforms). => can you run the xusb test program you'll find in the binary archive with: "xusb -d -i 0BBF:3226" and report the result? Also, assuming that you have other devices connected, did you check with only your test device plugged in? 3. Finally, there's also the possibility that differences in the device we test against plays a part, but we're no longer reading the feature reports, so that shouldn't really play. Still it might be worth to also test a couple loops with debug logging turned on, so that we can compare the results. To do that, you can just uncomment the // libusb_set_debug(context, 4); line, and then use: "if (counter > 2) break;" to exit the loop. Below is the log I get on XP when I do just that: Regards /Pete [1] http://libusb-winusb-wip.googlecode.com/files/leak.7z ---------------------------------------------------------------------------- libusb:debug [libusb_get_device_list] libusb:debug [windows_get_device_list] allocating new device for session [197] libusb:debug [windows_get_device_list] allocating new device for session [3A6] libusb:debug [windows_get_device_list] allocating new device for session [2C6] libusb:debug [windows_get_device_list] allocating new device for session [32] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2AA] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [C6] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [392] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [D1] libusb:debug [windows_get_device_list] found existing device for session [2AA] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&28FEF180&0' libusb:debug [windows_get_device_list] found existing device for session [C6] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&389651E0&0' libusb:debug [windows_get_device_list] found existing device for session [392] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&5E88044&0' libusb:debug [windows_get_device_list] found existing device for session [D1] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&36326108&0' libusb:debug [windows_get_device_list] allocating new device for session [3B6] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 41 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 1): '\\.\USB#VID_0001&PID_0001#5&290EAE46&0&1' libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [3B6] libusb:debug [windows_get_device_list] setting HID interface for [3B6]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_0001&PID_0001#6&333D4290&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_open] open 3.2 libusb:debug [hid_open] set maximum input buffer size to 512 libusb:debug [hid_open] 1 HID input report value(s) found libusb:debug [hid_open] Report ID: 0x01 libusb:debug [hid_open] 1 HID output report value(s) found libusb:debug [hid_open] Report ID: 0x02 libusb:debug [hid_open] 1 HID feature report value(s) found libusb:debug [hid_open] Report ID: 0x03 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_close] libusb:debug [libusb_unref_device] destroy device 3.2 libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context report 0 OK libusb:debug [libusb_get_device_list] libusb:debug [windows_get_device_list] allocating new device for session [197] libusb:debug [windows_get_device_list] allocating new device for session [3A6] libusb:debug [windows_get_device_list] allocating new device for session [2C6] libusb:debug [windows_get_device_list] allocating new device for session [32] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2AA] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [C6] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [392] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [D1] libusb:debug [windows_get_device_list] found existing device for session [2AA] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&28FEF180&0' libusb:debug [windows_get_device_list] found existing device for session [C6] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&389651E0&0' libusb:debug [windows_get_device_list] found existing device for session [392] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&5E88044&0' libusb:debug [windows_get_device_list] found existing device for session [D1] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&36326108&0' libusb:debug [windows_get_device_list] allocating new device for session [3B6] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 41 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 1): '\\.\USB#VID_0001&PID_0001#5&290EAE46&0&1' libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [3B6] libusb:debug [windows_get_device_list] setting HID interface for [3B6]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_0001&PID_0001#6&333D4290&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_open] open 3.2 libusb:debug [hid_open] set maximum input buffer size to 512 libusb:debug [hid_open] 1 HID input report value(s) found libusb:debug [hid_open] Report ID: 0x01 libusb:debug [hid_open] 1 HID output report value(s) found libusb:debug [hid_open] Report ID: 0x02 libusb:debug [hid_open] 1 HID feature report value(s) found libusb:debug [hid_open] Report ID: 0x03 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_close] libusb:debug [libusb_unref_device] destroy device 3.2 libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context report 1 OK libusb:debug [libusb_get_device_list] libusb:debug [windows_clock_gettime_threaded] hires timer available (Frequency:3579545 Hz) libusb:debug [windows_get_device_list] allocating new device for session [197] libusb:debug [windows_get_device_list] allocating new device for session [3A6] libusb:debug [windows_get_device_list] allocating new device for session [2C6] libusb:debug [windows_get_device_list] allocating new device for session [32] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2AA] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [C6] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [392] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [D1] libusb:debug [windows_get_device_list] found existing device for session [2AA] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&28FEF180&0' libusb:debug [windows_get_device_list] found existing device for session [C6] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&389651E0&0' libusb:debug [windows_get_device_list] found existing device for session [392] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&5E88044&0' libusb:debug [windows_get_device_list] found existing device for session [D1] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&36326108&0' libusb:debug [windows_get_device_list] allocating new device for session [3B6] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 41 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 1): '\\.\USB#VID_0001&PID_0001#5&290EAE46&0&1' libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [3B6] libusb:debug [windows_get_device_list] setting HID interface for [3B6]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_0001&PID_0001#6&333D4290&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_open] open 3.2 libusb:debug [hid_open] set maximum input buffer size to 512 libusb:debug [hid_open] 1 HID input report value(s) found libusb:debug [hid_open] Report ID: 0x01 libusb:debug [hid_open] 1 HID output report value(s) found libusb:debug [hid_open] Report ID: 0x02 libusb:debug [hid_open] 1 HID feature report value(s) found libusb:debug [hid_open] Report ID: 0x03 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_close] libusb:debug [libusb_unref_device] destroy device 3.2 libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context report 2 OK exited on attempt 3 |
From: Stefano A. <san...@al...> - 2010-11-17 20:52:36
|
On 2010/11/17 04:05 Pete Batard wrote: > OK, here are my results using the source you attached (just changed > VID/PID and REPORT_SIZE), on Windows 7 (32 and 64 bit) and Windows XP > (32 bit). This is becoming onerous. Thanks for digging. > And just to confirm, you are using an HID device, and didn't install the > WinUSB driver against it, right? I didn't speficially install WinUSB, though I can't confirm if I've ever done so in the past. How would I know? > Basically, these results leave us with 3 possibilities: > > 1. Compilation specific issue > => I have uploaded a version of your test program (with your > VID/PID/REPORT_SIZE values) compiled in my MinGW32 environment. The > expectation is that you should still see a leak with it on your > platform. You can download it there [1]. I downloaded this file and it also leaks. One interesting thing I discovered is that there doesn't even need to be a device connected. Simply calling the open/close case and getting the failed to create handle error message leaks the same. > 2. Hardware specific issue (eg. on your platform, you have an USB HCD or > device that produces a leak during enumeration, while I don't have > anything similar on any of my platforms). I think we can rule out the usb device... > => can you run the xusb test program you'll find in the binary archive > with: "xusb -d -i 0BBF:3226" and report the result? Using libusb v1.0.8.10321 Opening device... libusb:debug [libusb_get_device_list] libusb:debug [windows_clock_gettime_threaded] hires timer available (Frequency: 3579545 Hz) libusb:debug [windows_get_device_list] allocating new device for session [30C] libusb:debug [windows_get_device_list] allocating new device for session [83] libusb:debug [windows_get_device_list] allocating new device for session [204] libusb:debug [windows_get_device_list] allocating new device for session [38C] libusb:debug [windows_get_device_list] allocating new device for session [71] libusb:debug [windows_get_device_list] allocating new device for session [25E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [11E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [15D] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2DF] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [196] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [36E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [336] libusb:debug [windows_get_device_list] found existing device for session [11E] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&167C924A&0' libusb:debug [windows_get_device_list] found existing device for session [15D] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&1F36F67F&0' libusb:debug [windows_get_device_list] found existing device for session [2DF] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&338F3361&0' libusb:debug [windows_get_device_list] found existing device for session [196] libusb:debug [init_device] (bus: 6, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&39CC3CB4&0' libusb:debug [windows_get_device_list] found existing device for session [36E] libusb:debug [init_device] (bus: 5, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&4F26993&0' libusb:debug [windows_get_device_list] found existing device for session [336] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&3A38354E&0' libusb:debug [windows_get_device_list] allocating new device for session [14F] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 34 bytes) libusb:debug [init_device] (bus: 3, addr: 1, depth: 1, port: 1): '\\.\USB#VID_046D&PID_C00C#5&3682C886&0&1' libusb:debug [windows_get_device_list] allocating new device for session [1C3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 39 bytes) libusb:debug [init_device] (bus: 4, addr: 2, depth: 1, port: 2): '\\.\USB#VID_0483&PID_2016#5&1EB69156&0&2' libusb:debug [windows_get_device_list] allocating new device for session [39A] libusb:debug [init_device] found 0 configurations (active conf: 1) libusb:debug [init_device] (bus: 2, addr: 1, depth: 1, port: 2): '\\.\USB#VID_0BBF&PID_3226#5&2F814857&0&2' libusb:debug [discovered_devs_append] need to increase capacity libusb:debug [windows_get_device_list] allocating new device for session [3A3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 95 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 2): '\\.\USB#VID_1B96&PID_0001#5&3682C886&0&2' libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [14F] libusb:debug [get_api_type] driver(s): TCUSB libusb:debug [windows_get_device_list] found existing device for session [1C3] libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [39A] libusb:debug [get_api_type] driver(s): USBCCGP libusb:debug [get_api_type] matched driver name against Composite API libusb:debug [windows_get_device_list] found existing device for session [3A3] libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL01#5&1D4FA8B4&0&0000' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL02#5&1D4FA8B4&0&0001' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL03#5&1D4FA8B4&0&0002' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL04#5&1D4FA8B4&0&0003' libusb:debug [windows_get_device_list] setting HID interface for [14F]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_046D&PID_C00C#6&11E59407&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting HID interface for [39A]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_0BBF&PID_3226#6&252C2EC0&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL01#7&FE8E350&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[0] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001 libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL01#7&13EE5A72&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_unref_device] destroy device 5.0 libusb:debug [libusb_unref_device] destroy device 6.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_open] open 2.1 libusb:debug [hid_open] set maximum input buffer size to 512 libusb:debug [hid_open] 0 HID input report value(s) found libusb:debug [hid_open] 0 HID output report value(s) found libusb:debug [hid_open] 5 HID feature report value(s) found libusb:debug [hid_open] Report ID: 0x01 libusb:debug [hid_open] Report ID: 0x02 libusb:debug [hid_open] Report ID: 0x03 libusb:debug [hid_open] Report ID: 0x04 libusb:debug [hid_open] Report ID: 0x05 libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 6.255 libusb:debug [libusb_unref_device] destroy device 5.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.1 libusb:debug [libusb_unref_device] destroy device 4.2 libusb:debug [libusb_unref_device] destroy device 3.2 Reading device descriptor: libusb:debug [libusb_get_device_descriptor] length: 18 device class: 0 S/N: 0 VID:PID: 0BBF:3226 bcdDevice: 0000 iMan:iProd:iSer: 1:2:0 nb confs: 0 Reading configuration descriptors: libusb:debug [libusb_get_config_descriptor] index 0 Entity not found libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context libusb:warning [libusb_exit] application left some devices open > Also, assuming that you have other devices connected, did you check > with only your test device plugged in? My machine is a laptop with built-in usb keyboard and trackpad connections so I can't really do that. However, only one device with the VID/PID was connected. > 3. Finally, there's also the possibility that differences in the device > we test against plays a part, but we're no longer reading the feature > reports, so that shouldn't really play. As mentioned above, this doesn't seem plausible. > Still it might be worth to also test a couple loops with debug logging > turned on, so that we can compare the results. To do that, you can just > uncomment the // libusb_set_debug(context, 4); line, and then use: > "if (counter > 2) break;" to exit the loop. Here's the output: libusb:debug [libusb_get_device_list] libusb:debug [windows_get_device_list] allocating new device for session [30C] libusb:debug [windows_get_device_list] allocating new device for session [83] libusb:debug [windows_get_device_list] allocating new device for session [204] libusb:debug [windows_get_device_list] allocating new device for session [38C] libusb:debug [windows_get_device_list] allocating new device for session [71] libusb:debug [windows_get_device_list] allocating new device for session [25E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [11E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [15D] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2DF] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [196] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [36E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [336] libusb:debug [windows_get_device_list] found existing device for session [11E] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&167C924A&0' libusb:debug [windows_get_device_list] found existing device for session [15D] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&1F36F67F&0' libusb:debug [windows_get_device_list] found existing device for session [2DF] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&338F3361&0' libusb:debug [windows_get_device_list] found existing device for session [196] libusb:debug [init_device] (bus: 6, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&39CC3CB4&0' libusb:debug [windows_get_device_list] found existing device for session [36E] libusb:debug [init_device] (bus: 5, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&4F26993&0' libusb:debug [windows_get_device_list] found existing device for session [336] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&3A38354E&0' libusb:debug [windows_get_device_list] allocating new device for session [14F] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 34 bytes) libusb:debug [init_device] (bus: 3, addr: 1, depth: 1, port: 1): '\\.\USB#VID_046D&PID_C00C#5&3682C886&0&1' libusb:debug [windows_get_device_list] allocating new device for session [1C3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 39 bytes) libusb:debug [init_device] (bus: 4, addr: 2, depth: 1, port: 2): '\\.\USB#VID_0483&PID_2016#5&1EB69156&0&2' libusb:debug [windows_get_device_list] allocating new device for session [3A3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 95 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 2): '\\.\USB#VID_1B96&PID_0001#5&3682C886&0&2' libusb:debug [discovered_devs_append] need to increase capacity libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [14F] libusb:debug [get_api_type] driver(s): TCUSB libusb:debug [windows_get_device_list] found existing device for session [1C3] libusb:debug [get_api_type] driver(s): USBCCGP libusb:debug [get_api_type] matched driver name against Composite API libusb:debug [windows_get_device_list] found existing device for session [3A3] libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL01#5&1D4FA8B4&0&0000' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL02#5&1D4FA8B4&0&0001' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL03#5&1D4FA8B4&0&0002' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL04#5&1D4FA8B4&0&0003' libusb:debug [windows_get_device_list] setting HID interface for [14F]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_046D&PID_C00C#6&11E59407&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL01#7&FE8E350&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[0] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001 libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL01#7&13EE5A72&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_unref_device] destroy device 5.0 libusb:debug [libusb_unref_device] destroy device 6.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 6.255 libusb:debug [libusb_unref_device] destroy device 5.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.1 libusb:debug [libusb_unref_device] destroy device 4.2 libusb:debug [libusb_unref_device] destroy device 3.2 libusb_open_device_with_vid_pid failed to create handle libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context report 0 OK libusb:debug [libusb_get_device_list] libusb:debug [windows_clock_gettime_threaded] hires timer available (Frequency: 3579545 Hz) libusb:debug [windows_get_device_list] allocating new device for session [30C] libusb:debug [windows_get_device_list] allocating new device for session [83] libusb:debug [windows_get_device_list] allocating new device for session [204] libusb:debug [windows_get_device_list] allocating new device for session [38C] libusb:debug [windows_get_device_list] allocating new device for session [71] libusb:debug [windows_get_device_list] allocating new device for session [25E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [11E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [15D] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2DF] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [196] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [36E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [336] libusb:debug [windows_get_device_list] found existing device for session [11E] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&167C924A&0' libusb:debug [windows_get_device_list] found existing device for session [15D] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&1F36F67F&0' libusb:debug [windows_get_device_list] found existing device for session [2DF] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&338F3361&0' libusb:debug [windows_get_device_list] found existing device for session [196] libusb:debug [init_device] (bus: 6, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&39CC3CB4&0' libusb:debug [windows_get_device_list] found existing device for session [36E] libusb:debug [init_device] (bus: 5, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&4F26993&0' libusb:debug [windows_get_device_list] found existing device for session [336] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&3A38354E&0' libusb:debug [windows_get_device_list] allocating new device for session [14F] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 34 bytes) libusb:debug [init_device] (bus: 3, addr: 1, depth: 1, port: 1): '\\.\USB#VID_046D&PID_C00C#5&3682C886&0&1' libusb:debug [windows_get_device_list] allocating new device for session [1C3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 39 bytes) libusb:debug [init_device] (bus: 4, addr: 2, depth: 1, port: 2): '\\.\USB#VID_0483&PID_2016#5&1EB69156&0&2' libusb:debug [windows_get_device_list] allocating new device for session [3A3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 95 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 2): '\\.\USB#VID_1B96&PID_0001#5&3682C886&0&2' libusb:debug [discovered_devs_append] need to increase capacity libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [14F] libusb:debug [get_api_type] driver(s): TCUSB libusb:debug [windows_get_device_list] found existing device for session [1C3] libusb:debug [get_api_type] driver(s): USBCCGP libusb:debug [get_api_type] matched driver name against Composite API libusb:debug [windows_get_device_list] found existing device for session [3A3] libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL01#5&1D4FA8B4&0&0000' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL02#5&1D4FA8B4&0&0001' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL03#5&1D4FA8B4&0&0002' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL04#5&1D4FA8B4&0&0003' libusb:debug [windows_get_device_list] setting HID interface for [14F]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_046D&PID_C00C#6&11E59407&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL01#7&FE8E350&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[0] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001 libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL01#7&13EE5A72&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_unref_device] destroy device 5.0 libusb:debug [libusb_unref_device] destroy device 6.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 6.255 libusb:debug [libusb_unref_device] destroy device 5.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.1 libusb:debug [libusb_unref_device] destroy device 4.2 libusb:debug [libusb_unref_device] destroy device 3.2 libusb_open_device_with_vid_pid failed to create handle libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context report 1 OK libusb:debug [libusb_get_device_list] libusb:debug [windows_clock_gettime_threaded] hires timer available (Frequency: 3579545 Hz) libusb:debug [windows_get_device_list] allocating new device for session [30C] libusb:debug [windows_get_device_list] allocating new device for session [83] libusb:debug [windows_get_device_list] allocating new device for session [204] libusb:debug [windows_get_device_list] allocating new device for session [38C] libusb:debug [windows_get_device_list] allocating new device for session [71] libusb:debug [windows_get_device_list] allocating new device for session [25E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [11E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [15D] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [2DF] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [196] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [36E] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [336] libusb:debug [windows_get_device_list] found existing device for session [11E] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&167C924A&0' libusb:debug [windows_get_device_list] found existing device for session [15D] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&1F36F67F&0' libusb:debug [windows_get_device_list] found existing device for session [2DF] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&338F3361&0' libusb:debug [windows_get_device_list] found existing device for session [196] libusb:debug [init_device] (bus: 6, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&39CC3CB4&0' libusb:debug [windows_get_device_list] found existing device for session [36E] libusb:debug [init_device] (bus: 5, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&4F26993&0' libusb:debug [windows_get_device_list] found existing device for session [336] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&3A38354E&0' libusb:debug [windows_get_device_list] allocating new device for session [14F] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 34 bytes) libusb:debug [init_device] (bus: 3, addr: 1, depth: 1, port: 1): '\\.\USB#VID_046D&PID_C00C#5&3682C886&0&1' libusb:debug [windows_get_device_list] allocating new device for session [1C3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 39 bytes) libusb:debug [init_device] (bus: 4, addr: 2, depth: 1, port: 2): '\\.\USB#VID_0483&PID_2016#5&1EB69156&0&2' libusb:debug [windows_get_device_list] allocating new device for session [3A3] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 95 bytes) libusb:debug [init_device] (bus: 3, addr: 2, depth: 1, port: 2): '\\.\USB#VID_1B96&PID_0001#5&3682C886&0&2' libusb:debug [discovered_devs_append] need to increase capacity libusb:debug [get_api_type] driver(s): HIDUSB libusb:debug [get_api_type] matched driver name against HID API libusb:debug [windows_get_device_list] found existing device for session [14F] libusb:debug [get_api_type] driver(s): TCUSB libusb:debug [windows_get_device_list] found existing device for session [1C3] libusb:debug [get_api_type] driver(s): USBCCGP libusb:debug [get_api_type] matched driver name against Composite API libusb:debug [windows_get_device_list] found existing device for session [3A3] libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL01#5&1D4FA8B4&0&0000' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL02#5&1D4FA8B4&0&0001' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL03#5&1D4FA8B4&0&0002' libusb:debug [get_ancestor_session_id] detected non USB parent 'PCI\VEN_1002&DEV_438D&SUBSYS_00000000&REV_00\3&61AAA01&0&A3' libusb:debug [windows_get_device_list] skipping non USB HID interface '\\.\HID#DELABCD&COL04#5&1D4FA8B4&0&0003' libusb:debug [windows_get_device_list] setting HID interface for [14F]: libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_046D&PID_C00C#6&11E59407&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL01#7&FE8E350&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[0] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001 libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_1B96&PID_0001&MI_00&COL02#7&FE8E350&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL01#7&13EE5A72&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [3A3]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_1B96&PID_0001&MI_01&COL02#7&13EE5A72&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [libusb_unref_device] destroy device 1.0 libusb:debug [libusb_unref_device] destroy device 2.0 libusb:debug [libusb_unref_device] destroy device 3.0 libusb:debug [libusb_unref_device] destroy device 4.0 libusb:debug [libusb_unref_device] destroy device 5.0 libusb:debug [libusb_unref_device] destroy device 6.0 libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_get_device_descriptor] libusb:debug [libusb_unref_device] destroy device 3.255 libusb:debug [libusb_unref_device] destroy device 4.255 libusb:debug [libusb_unref_device] destroy device 2.255 libusb:debug [libusb_unref_device] destroy device 6.255 libusb:debug [libusb_unref_device] destroy device 5.255 libusb:debug [libusb_unref_device] destroy device 1.255 libusb:debug [libusb_unref_device] destroy device 3.1 libusb:debug [libusb_unref_device] destroy device 4.2 libusb:debug [libusb_unref_device] destroy device 3.2 libusb_open_device_with_vid_pid failed to create handle libusb:debug [libusb_exit] libusb:debug [libusb_exit] destroying default context report 2 OK exited on attempt 3 |
From: Pete B. <pb...@gm...> - 2010-11-18 00:11:48
|
On 2010.11.17 20:52, Stefano Antonelli wrote: > This is becoming onerous. Thanks for digging. Not a problem. If there's a leak in libusb, we need to fix it. >> And just to confirm, you are using an HID device, and didn't install the >> WinUSB driver against it, right? > > I didn't speficially install WinUSB, though I can't confirm if I've ever done so in the past. How would I know? Well, if you haven't changed the driver since the last time you read reports, you wouldn't be using WinUSB. The way to check which driver is in use is to check the Service property, when accessing your device in the device manager (Properties -> Details). If it doesn't say "WinUSB", then you're not using WinUSB. But the log you provided indicates that you're indeed using the HID driver anyway: > libusb:debug [windows_get_device_list] allocating new device for session [39A] > libusb:debug [init_device] found 0 configurations (active conf: 1) > libusb:debug [init_device] (bus: 2, addr: 1, depth: 1, port: 2): '\\.\USB#VID_0BBF&PID_3226#5&2F814857&0&2' (...) > libusb:debug [get_api_type] matched driver name against HID API > libusb:debug [windows_get_device_list] found existing device for session [39A] (...) > libusb:debug [windows_get_device_list] setting HID interface for [39A]: > libusb:debug [set_hid_interface] interface[0] = \\.\HID#VID_0BBF&PID_3226#6&252C2EC0&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} > I downloaded this file and it also leaks. One interesting thing I discovered is that there doesn't even need to be a device connected. Simply calling the open/close case and getting the failed to create handle error message leaks the same. OK, that rules out compilation, and seems to point out to an enumeration issue. I've been trying to test with all the devices I have at hand, to see if I could pick something up, but no success so far. The main possible sources I see for the leak then are: - the non USB HID device (ATI/Sigma Corp \\.\HID#DELABCD&COL0...) with its PCI parent - the Touch/Stylus input device (N-trig \\.\HID#VID_1B96&PID_0001) with its multiple HID collections I don't have access to a non USB HID device, but I might have access to one with multiple HID collections, so I'll see what I can do. Obviously I'll check the code against these kind of devices to see if I can identify something that could cause a leak. The other devices you have are fairly regular (VID_046D&PID_C00C is a composite Logitech tracking device and VID_0483&PID_2016 is a fingerprint reader), so I'm hoping that I covered similar ones in my tests, and can rule them out for the time being. Regards, /Pete |
From: Pete B. <pb...@gm...> - 2010-11-18 00:32:26
|
Aha! This is a leak with USB devices that have HID collections. I have just tried such a device (a Logitech wireless keyboard/mouse) and I can finally observe the leak, in Windows 7 x64. With the ability to test, I should be able to properly plug this hole. I'll let you know when I have a patch. Regards, /Pete Opening device... libusb:debug [libusb_get_device_list] libusb:debug [windows_get_device_list] allocating new device for session [129] libusb:debug [windows_get_device_list] allocating new device for session [231] libusb:debug [windows_get_device_list] allocating new device for session [340] libusb:debug [windows_get_device_list] allocating new device for session [11F] libusb:debug [windows_get_device_list] allocating new device for session [227] libusb:debug [windows_get_device_list] allocating new device for session [364] libusb:debug [windows_get_device_list] allocating new device for session [28A] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [33A] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [3EE] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [387] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [79] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [FE] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [16F] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [1A8] libusb:debug [get_api_type] driver(s): USBHUB libusb:debug [get_api_type] matched driver name against HUB API libusb:debug [windows_get_device_list] allocating new device for session [136] libusb:debug [windows_get_device_list] found existing device for session [33A] libusb:debug [init_device] (bus: 1, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&10B2C51B&0' libusb:debug [windows_get_device_list] found existing device for session [3EE] libusb:debug [init_device] (bus: 4, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&2600A89F&0' libusb:debug [windows_get_device_list] found existing device for session [387] libusb:debug [init_device] (bus: 2, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&270D945D&0' libusb:debug [windows_get_device_list] found existing device for session [79] libusb:debug [init_device] (bus: 3, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&2FB3158C&0' libusb:debug [windows_get_device_list] found existing device for session [FE] libusb:debug [init_device] (bus: 5, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB#4&3B6FF112&0' libusb:debug [windows_get_device_list] found existing device for session [16F] libusb:debug [init_device] (bus: 7, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&1087794A&0' libusb:debug [windows_get_device_list] found existing device for session [1A8] libusb:debug [init_device] (bus: 6, addr: 255, depth: 0, port: 0): '\\.\USB#ROOT_HUB20#4&27A8BD23&0' libusb:debug [windows_get_device_list] found existing device for session [136] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [init_device] (bus: 6, addr: 1, depth: 1, port: 4): '\\.\USB#VID_0424&PID_A700#5&4117526&0&4' libusb:debug [windows_get_device_list] allocating new device for session [35F] libusb:debug [init_device] found 1 configurations (active conf: 1) libusb:debug [cache_config_descriptors] cached config descriptor 0 (bConfigurationValue=1, 59 bytes) libusb:debug [init_device] (bus: 4, addr: 1, depth: 1, port: 2): '\\.\USB#VID_046D&PID_C517#5&285DE58C&0&2' libusb:debug [discovered_devs_append] need to increase capacity libusb:debug [get_api_type] driver(s): USBCCGP libusb:debug [get_api_type] matched driver name against Composite API libusb:debug [windows_get_device_list] found existing device for session [35F] libusb:debug [windows_get_device_list] setting composite interface for [35F]: libusb:debug [set_composite_interface] interface[0] = \\.\HID#VID_046D&PID_C517&MI_00#7&3885FA2E&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [35F]: libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_046D&PID_C517&MI_01&COL01#7&101B4C65&0&0000#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [35F]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_046D&PID_C517&MI_01&COL02#7&101B4C65&0&0001 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_046D&PID_C517&MI_01&COL02#7&101B4C65&0&0001#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [35F]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_046D&PID_C517&MI_01&COL03#7&101B4C65&0&0002 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_046D&PID_C517&MI_01&COL03#7&101B4C65&0&0002#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [35F]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_046D&PID_C517&MI_01&COL04#7&101B4C65&0&0003 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_046D&PID_C517&MI_01&COL04#7&101B4C65&0&0003#{4D1E55B2-F16F-11CF-88CB-001111000030} libusb:debug [windows_get_device_list] setting composite interface for [35F]: libusb:debug [set_composite_interface] interface_path[1] already set - ignoring HID collection: \\.\HID#VID_046D&PID_C517&MI_01&COL05#7&101B4C65&0&0004 libusb:debug [set_composite_interface] interface[1] = \\.\HID#VID_046D&PID_C517&MI_01&COL05#7&101B4C65&0&0004#{4D1E55B2-F16F-11CF-88CB-001111000030} |
From: Pete B. <pb...@gm...> - 2010-11-18 13:34:50
|
Problem should now be fixed in pbr322 (binary snapshot is also available). Basically, we didn't just ignore the extra HID collections during enum, but we also ignored freeing the unassigned device interface path we ended up with as a result. Been testing pbr322 for the last half hour, and the sample program is holding steady at 1972K for the private bytes. Once again, many thanks for helping out with this issue. Regards, /Pete |
From: Stefano A. <san...@al...> - 2010-11-19 18:31:13
|
Pete Batard wrote: > Problem should now be fixed in pbr322 (binary snapshot is > also available). I tested this out and the resulting binary's private bytes were rock solid for over an hour. Very nice, thanks for the fix! I just wanted to mention a wierd thing I noticed, perhaps you can reproduce it on your end. I haven't done enough to verify this as an actual problem with libusb, but here are the steps to reproduce: 1. connect a device with a VID/PID that will open with the leak test application 2. run the leak test application (should open the device succesfully) 3. connect an external wireless mouse (I suspect anything will do). The new device *may* fail to enumerate (Unknown device). I saw it about 5 times out of 25 with the test app running and 0 out of 25 times when it wasn't running. Is this something that could be expected to happen when constantly trying to open a device? Do some of the libusb calls block the OS from enumeration? The only reason I noticed it at all was because I plugged in my wireless mouse after I started running the test app and it failed to enumerate 3 times in a row. -Stef |
From: Peter S. <pe...@st...> - 2010-11-19 19:40:27
|
Stefano Antonelli wrote: > The new device *may* fail to enumerate (Unknown device). So Windows doesn't even recognize it? Or just that libusb doesn't find it? > Is this something that could be expected to happen when constantly > trying to open a device? No, that shouldn't happen. //Peter |