I am having trouble finding the cause of a hang in a Win32 application. The software displays some data in an OpenGL visual in a narrow loop:
std::vector<uint8_t> indices; glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_DOUBLE, 0, vertexDataBuffer); while (...) {
The code is compiled using VC11 Update 1 (CTP 3). When you run the optimized binary, it hangs inside the call to getIndices() (more on this below) after several of these loops. I have it already...
- triple has confirmed all buffers even added by CRC to make sure I don't have buffer overflows.
- Added HeapValidate () call inside the loop to ensure that the heap is not corrupted.
- used by ApplicationVerifier
- Enable heap allocation monitoring using GFlags and PageHeap .
- burst into WinDbg when the application blocks
I did not find any problems with the code accessing the allocated buffer, and no heap damage. However, if I turn off the low fragmentation heap , the problem will disappear. It also disappears if I use a separate (low destructive) heap for the indices buffer.
Anyway, here is the stack trace leading to a deadlock:
0:000> kb ChildEBP RetAddr Args to Child 0034e328 77b039c3 00000000 0034e350 00000000 ntdll!ZwWaitForKeyedEvent+0x15 0034e394 77b062bc 77b94724 080d36a8 0034e464 ntdll!RtlAcquireSRWLockExclusive+0x12e 0034e3c0 77aeb652 0034e464 0034e4b4 00000000 ntdll!RtlpCallVectoredHandlers+0x58 0034e3d4 77aeb314 0034e464 0034e4b4 77b94724 ntdll!RtlCallVectoredExceptionHandlers+0x12 0034e44c 77aa0133 0034e464 0034e4b4 0034e464 ntdll!RtlDispatchException+0x19 0034e44c 77b062c5 0034e464 0034e4b4 0034e464 ntdll!KiUserExceptionDispatcher+0xf 0034e7bc 77aeb652 0034e860 0034e8b0 00000000 ntdll!RtlpCallVectoredHandlers+0x61 0034e7d0 77aeb314 0034e860 0034e8b0 0034ec28 ntdll!RtlCallVectoredExceptionHandlers+0x12 0034e848 77aa0133 0034e860 0034e8b0 0034e860 ntdll!RtlDispatchException+0x19 0034e848 1c43c666 0034e860 0034e8b0 0034e860 ntdll!KiUserExceptionDispatcher+0xf 0034ebe8 1c43c4e5 0034ec28 080d35d0 080d35d6 lcdb4!lc::db::PackedIndices::unpackIndices<unsigned char>+0x86 0034ec14 1c45922d 0034ec28 080d35d0 00000006 lcdb4!lc::db::PackedIndices::unpack+0xb5 ... xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx getIndices
For completeness, I sent the code lc::db::PackedIndices::unpackIndices() , including all the code added for debugging, to http://ideone.com/sVVXX7 .
The code that calls KiUserExceptionDispatcher is (*p++) = static_cast<T>(index); ( mov dword ptr [esp+10h],eax ).
I just can't understand what is happening. It seems that an exception has been thrown, but none of my exception handlers have been called. The application just freezes. I checked any locked critical sections ( !lock ), but did not find them. Also, I don’t understand why you need to throw an exception, since all memory cells are valid. Can someone give me some advice?
Update
I tried to find the type of exception to throw:
0:000> s -d esp L1000 1003f 0028ebdc 0001003f 00000000 00000000 00000000 ?............... 0028efd8 0001003f 00000000 00000000 00000000 ?............... 0:000> .cxr 0028ebdc eax=77b94724 ebx=0804be30 ecx=00000002 edx=00000004 esi=77b94724 edi=0804be28 eip=77b062c5 esp=0028eec4 ebp=0028eee4 iopl=0 nv up ei ng nz na pe cy cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010287 ntdll!RtlpCallVectoredHandlers+0x61: 77b062c5 ff03 inc dword ptr [ebx] ds:002b:0804be30=00000001 0:000> .cxr 0028efd8 eax=0000003b ebx=00000001 ecx=0804bd98 edx=0028f340 esi=0028f340 edi=04b77580 eip=1c43c296 esp=0028f2c0 ebp=0028f2fc iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202 lcdb4!lc::db::PackedIndices::unpackIndices<unsigned char>+0x36: 1c43c296 8801 mov byte ptr [ecx],al ds:002b:0804bd98=3e