8148813: Windows os::check_heap needs more information
Added ring buffer to log info while walking the heap Reviewed-by: mgronlun, dholmes, ccheung
This commit is contained in:
parent
634a7fdebc
commit
1bcb5e5156
@ -5250,6 +5250,12 @@ int os::fork_and_exec(char* cmd) {
|
||||
|
||||
static int mallocDebugIntervalCounter = 0;
|
||||
static int mallocDebugCounter = 0;
|
||||
|
||||
// For debugging possible bugs inside HeapWalk (a ring buffer)
|
||||
#define SAVE_COUNT 8
|
||||
static PROCESS_HEAP_ENTRY saved_heap_entries[SAVE_COUNT];
|
||||
static int saved_heap_entry_index;
|
||||
|
||||
bool os::check_heap(bool force) {
|
||||
if (++mallocDebugCounter < MallocVerifyStart && !force) return true;
|
||||
if (++mallocDebugIntervalCounter >= MallocVerifyInterval || force) {
|
||||
@ -5270,13 +5276,28 @@ bool os::check_heap(bool force) {
|
||||
if (HeapLock(heap) != 0) {
|
||||
PROCESS_HEAP_ENTRY phe;
|
||||
phe.lpData = NULL;
|
||||
memset(saved_heap_entries, 0, sizeof(saved_heap_entries));
|
||||
saved_heap_entry_index = 0;
|
||||
int count = 0;
|
||||
|
||||
while (HeapWalk(heap, &phe) != 0) {
|
||||
count ++;
|
||||
if ((phe.wFlags & PROCESS_HEAP_ENTRY_BUSY) &&
|
||||
!HeapValidate(heap, 0, phe.lpData)) {
|
||||
tty->print_cr("C heap has been corrupted (time: %d allocations)", mallocDebugCounter);
|
||||
tty->print_cr("corrupted block near address %#x, length %d", phe.lpData, phe.cbData);
|
||||
tty->print_cr("corrupted block near address %#x, length %d, count %d", phe.lpData, phe.cbData, count);
|
||||
HeapUnlock(heap);
|
||||
fatal("corrupted C heap");
|
||||
} else {
|
||||
// Save previous seen entries in a ring buffer. We have seen strange
|
||||
// heap corruption fatal errors that produced mdmp files, but when we load
|
||||
// these mdmp files in WinDBG, "!heap -triage" shows no error.
|
||||
// We can examine the saved_heap_entries[] array in the mdmp file to
|
||||
// diagnose such seemingly spurious errors reported by HeapWalk.
|
||||
saved_heap_entries[saved_heap_entry_index++] = phe;
|
||||
if (saved_heap_entry_index >= SAVE_COUNT) {
|
||||
saved_heap_entry_index = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
DWORD err = GetLastError();
|
||||
|
Loading…
x
Reference in New Issue
Block a user