Ich bin ein 64-Bit-Multithread-Programm auf dem Windows Server 2003-Server (X64) laufen, lief es in einem Fall, dass einige der Threads in blockiert scheinen das malloc oder die freie Funktion für immer. Der Stack-Trace ist wie folgt:Threads sind in Malloc und freie, virtuelle Größe blockiert
ntdll.dll!NtWaitForSingleObject() + 0xa bytes
ntdll.dll!RtlpWaitOnCriticalSection() - 0x1aa bytes
ntdll.dll!RtlEnterCriticalSection() + 0xb040 bytes
ntdll.dll!RtlpDebugPageHeapAllocate() + 0x2f6 bytes
ntdll.dll!RtlDebugAllocateHeap() + 0x40 bytes
ntdll.dll!RtlAllocateHeapSlowly() + 0x5e898 bytes
ntdll.dll!RtlAllocateHeap() - 0x1711a bytes
MyProg.exe!malloc(unsigned __int64 size=0) Line 168 C
MyProg.exe!operator new(unsigned __int64 size=1) Line 59 + 0x5 bytes C++
ntdll.dll!NtWaitForSingleObject()
ntdll.dll!RtlpWaitOnCriticalSection()
ntdll.dll!RtlEnterCriticalSection()
ntdll.dll!RtlpDebugPageHeapFree()
ntdll.dll!RtlDebugFreeHeap()
ntdll.dll!RtlFreeHeapSlowly()
ntdll.dll!RtlFreeHeap()
MyProg.exe!free(void * pBlock=0x000000007e8e4fe0) C
BTW, ist die param Werte an den neuen Betreiber übergeben nicht richtig hier vielleicht durch Optimierung.
Auch zur gleichen Zeit, fand ich im Prozess Explorer, ist die virtuelle Größe dieses Programms 10 GB, aber die privaten Bytes und Arbeitssatz ist sehr klein (< 2GB). Wir hatten einige Threads mit virtualalloc, aber auf eine Weise, die den Speicher im Aufruf festschreibt, und diese Threads sind nicht blockiert.
m_pBuf = VirtualAlloc(NULL, m_size, MEM_COMMIT, PAGE_READWRITE);
......
VirtualFree(m_pBuf, 0, MEM_RELEASE);
Das sieht mir seltsam, scheint eine Menge virtuellen Raum reserviert, aber nicht verpflichtet und malloc/free durch Sperre blockiert. Ich vermute, dass es in dem Speicher/Objekt irgendwelche Beschädigungen gibt, also plane gflag mit pageheap um dies zu beheben.
Hat jemand ähnliche Erfahrung auf diesem zuvor? Könntest du mit mir teilen, damit ich weitere Hinweise bekomme?
Vielen Dank!
ein weiteres Update, das O ein Popup zu tun hatte „aus virtuellem Speicher“, als dies geschah zu sagen.Ich schätze, genau wie EmeryBerger es gesagt hat, weil ich aus Versehen den Seitenzugriff aktiviert habe, bevor ich mein Programm starte. Vielen Dank für die tolle Information, sehr geschätzt! –