diff options
author | Mike McLaughlin <mikem@microsoft.com> | 2018-12-13 15:37:21 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-13 15:37:21 -0800 |
commit | a6403ba4d9187fc19af8e3dc64ec3e9e937d53eb (patch) | |
tree | 9254e8fa8720658b0fe556fbfd638662030e4868 /src/debug | |
parent | 6b9e1dc685e55430d1471baa799db32bc2807a1c (diff) | |
download | coreclr-a6403ba4d9187fc19af8e3dc64ec3e9e937d53eb.tar.gz coreclr-a6403ba4d9187fc19af8e3dc64ec3e9e937d53eb.tar.bz2 coreclr-a6403ba4d9187fc19af8e3dc64ec3e9e937d53eb.zip |
Fixes issue #21485 and #21484 (#21526)
Issue #21485: fix EnumProcessModules hPseudoCurrentProcess bug.
Added handle reference.
Issue #21484: createdump segfaults with ASP.NET app
The problem is the ClrDataModule Request faulted on a dynamic module
getting the file layout flag.
Fixed the Request code not get the file layout and in the crash dump
code skip any dynamic modules.
Diffstat (limited to 'src/debug')
-rw-r--r-- | src/debug/createdump/crashinfo.cpp | 34 | ||||
-rw-r--r-- | src/debug/daccess/task.cpp | 7 |
2 files changed, 30 insertions, 11 deletions
diff --git a/src/debug/createdump/crashinfo.cpp b/src/debug/createdump/crashinfo.cpp index 6de6b94429..4db2b00eeb 100644 --- a/src/debug/createdump/crashinfo.cpp +++ b/src/debug/createdump/crashinfo.cpp @@ -708,6 +708,17 @@ CrashInfo::EnumerateManagedModules(IXCLRDataProcess* pClrDataProcess) break; } + // Skip any dynamic modules. The Request call below on some DACs crashes on dynamic modules. + ULONG32 flags; + if ((hr = pClrDataModule->GetFlags(&flags)) != S_OK) { + TRACE("MODULE: GetFlags FAILED %08x\n", hr); + continue; + } + if (flags & CLRDATA_MODULE_IS_DYNAMIC) { + TRACE("MODULE: Skipping dynamic module\n"); + continue; + } + DacpGetModuleData moduleData; if (SUCCEEDED(hr = moduleData.Request(pClrDataModule.GetPtr()))) { @@ -719,17 +730,20 @@ CrashInfo::EnumerateManagedModules(IXCLRDataProcess* pClrDataProcess) ArrayHolder<WCHAR> wszUnicodeName = new WCHAR[MAX_LONGPATH + 1]; if (SUCCEEDED(hr = pClrDataModule->GetFileName(MAX_LONGPATH, nullptr, wszUnicodeName))) { - char* pszName = (char*)malloc(MAX_LONGPATH + 1); - if (pszName == nullptr) { - fprintf(stderr, "Allocating module name FAILED\n"); - result = false; - break; + // If the module file name isn't empty + if (wszUnicodeName[0] != 0) { + char* pszName = (char*)malloc(MAX_LONGPATH + 1); + if (pszName == nullptr) { + fprintf(stderr, "Allocating module name FAILED\n"); + result = false; + break; + } + sprintf_s(pszName, MAX_LONGPATH, "%S", (WCHAR*)wszUnicodeName); + TRACE(" %s\n", pszName); + + // Change the module mapping name + ReplaceModuleMapping(moduleData.LoadedPEAddress, pszName); } - sprintf_s(pszName, MAX_LONGPATH, "%S", (WCHAR*)wszUnicodeName); - TRACE(" %s\n", pszName); - - // Change the module mapping name - ReplaceModuleMapping(moduleData.LoadedPEAddress, pszName); } else { TRACE("\nModule.GetFileName FAILED %08x\n", hr); diff --git a/src/debug/daccess/task.cpp b/src/debug/daccess/task.cpp index 601ad401af..d7d8ba5a84 100644 --- a/src/debug/daccess/task.cpp +++ b/src/debug/daccess/task.cpp @@ -2745,7 +2745,12 @@ ClrDataModule::RequestGetModuleData( COUNT_T peSize; outGMD->LoadedPEAddress = TO_CDADDR(PTR_TO_TADDR(pPEFile->GetLoadedImageContents(&peSize))); outGMD->LoadedPESize = (ULONG64)peSize; - outGMD->IsFileLayout = pPEFile->GetLoaded()->IsFlat(); + + // Can not get the file layout for a dynamic module + if (!outGMD->IsDynamic) + { + outGMD->IsFileLayout = pPEFile->GetLoaded()->IsFlat(); + } } // If there is a in memory symbol stream |