diff --git a/src/backend/port/win32_shmem.c b/src/backend/port/win32_shmem.c index f8ca52e1af..d431e0d036 100644 --- a/src/backend/port/win32_shmem.c +++ b/src/backend/port/win32_shmem.c @@ -191,6 +191,7 @@ PGSharedMemoryCreate(Size size, bool makePrivate, int port, SIZE_T largePageSize = 0; Size orig_size = size; DWORD flProtect = PAGE_READWRITE; + MEMORY_BASIC_INFORMATION info; /* Room for a header? */ Assert(size > MAXALIGN(sizeof(PGShmemHeader))); @@ -359,6 +360,14 @@ retry: /* Register on-exit routine to delete the new segment */ on_shmem_exit(pgwin32_SharedMemoryDelete, PointerGetDatum(hmap2)); + /* Log information about the segment's virtual memory use */ + if (VirtualQuery(memAddress, &info, sizeof(info)) != 0) + elog(LOG, "mapped shared memory segment at %p, requested size %zu, mapped size %zu", + memAddress, size, info.RegionSize); + else + elog(LOG, "VirtualQuery(%p) failed: error code %lu", + memAddress, GetLastError()); + *shim = hdr; return hdr; } @@ -392,8 +401,21 @@ PGSharedMemoryReAttach(void) hdr = (PGShmemHeader *) MapViewOfFileEx(UsedShmemSegID, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0, UsedShmemSegAddr); if (!hdr) + { + DWORD maperr = GetLastError(); + MEMORY_BASIC_INFORMATION info; + + if (VirtualQuery(UsedShmemSegAddr, &info, sizeof(info)) != 0) + elog(LOG, "VirtualQuery(%p) reports region of size %zu, base %p, has state 0x%lx", + UsedShmemSegAddr, info.RegionSize, + info.AllocationBase, info.State); + else + elog(LOG, "VirtualQuery(%p) failed: error code %lu", + UsedShmemSegAddr, GetLastError()); + elog(FATAL, "could not reattach to shared memory (key=%p, addr=%p): error code %lu", - UsedShmemSegID, UsedShmemSegAddr, GetLastError()); + UsedShmemSegID, UsedShmemSegAddr, maperr); + } if (hdr != origUsedShmemSegAddr) elog(FATAL, "reattaching to shared memory returned unexpected address (got %p, expected %p)", hdr, origUsedShmemSegAddr);