Misc SOS changes (#1428)
authorMike McLaughlin <mikem@microsoft.com>
Tue, 11 Aug 2020 03:52:05 +0000 (20:52 -0700)
committerGitHub <noreply@github.com>
Tue, 11 Aug 2020 03:52:05 +0000 (20:52 -0700)
Misc changes

Fix coreclr reload message for linux dumps on Windows

Fallback to getting assembly name (like when SOS is running on Linux/OSX) when building a function name when either GetModuleByteOffset or GetModuleNames fail.

Add target based get directory separator char function (GetTargetDirectorySeparatorW) to use in the linux module name returned by dbgeng for linux core dumps on Windows.

diagnostics.yml
src/SOS/SOS.Package/SOS.Package.csproj
src/SOS/Strike/runtime.cpp
src/SOS/Strike/strike.cpp
src/SOS/Strike/util.cpp
src/SOS/Strike/util.h

index 633c337b5bb36199fca369a58a887ded6c9e9a71..af637d8aa716e3936ca87b5c6a8a143522d1830b 100644 (file)
@@ -457,7 +457,7 @@ stages:
         publishInstallersAndChecksums: true
         SDLValidationParameters:
           enable: true
-          continueOnError: false
+          continueOnError: true
           params: ' -SourceToolsList @("policheck","credscan")
           -TsaInstanceURL $(_TsaInstanceURL)
           -TsaProjectName $(_TsaProjectName)
index 111ab848837c5367805d53e826529c6b1e9453cf..32720a5ed3400910a207ae124a31cf35c095affe 100644 (file)
@@ -49,7 +49,6 @@
                 </TriggerSet>
                 <TriggerSet>
                     <ModuleTrigger Name="libcoreclr.so" />
-                    <OSTrigger Name="Linux" />
                 </TriggerSet>
             </LoadTriggers>
             <EngineCommands>
index 85b047ed1a6fa8a845afbab0358a81357b35674f..67fb26ec41856d9fe043413076e7603ee6edd3fd 100644 (file)
@@ -105,7 +105,7 @@ static HRESULT GetSingleFileInfo(PULONG pModuleIndex, PULONG64 pModuleAddress, R
 \**********************************************************************/
 HRESULT Runtime::CreateInstance(RuntimeConfiguration configuration, Runtime **ppRuntime)
 {
-    PCSTR runtimeModuleName = GetRuntimeModuleName(configuration);
+    PCSTR runtimeModuleName = ::GetRuntimeModuleName(configuration);
     ULONG moduleIndex = 0;
     ULONG64 moduleAddress = 0;
     ULONG64 moduleSize = 0;
@@ -142,16 +142,16 @@ HRESULT Runtime::CreateInstance(RuntimeConfiguration configuration, Runtime **pp
 
                 if (params.SymbolType == SymDeferred)
                 {
+                    PCSTR runtimeDllName = ::GetRuntimeDllName(configuration);
                     std::string reloadCommand;
                     reloadCommand.append("/f ");
-                    reloadCommand.append(runtimeModuleName);
-                    reloadCommand.append(".dll");
+                    reloadCommand.append(runtimeDllName);
                     g_ExtSymbols->Reload(reloadCommand.c_str());
                     g_ExtSymbols->GetModuleParameters(1, &moduleAddress, 0, &params);
 
                     if (params.SymbolType != SymPdb && params.SymbolType != SymDia)
                     {
-                        ExtOut("PDB symbol for %s not loaded\n", runtimeModuleName);
+                        ExtOut("Symbols for %s not loaded. Some SOS commands may not work.\n", runtimeDllName);
                     }
                 }
             }
@@ -322,7 +322,7 @@ LPCSTR Runtime::GetRuntimeDirectory()
                 return nullptr;
             }
             // Parse off the file name
-            char* lastSlash = strrchr(szModuleName, DIRECTORY_SEPARATOR_CHAR_A);
+            char* lastSlash = strrchr(szModuleName, GetTargetDirectorySeparatorW());
             if (lastSlash != nullptr)
             {
                 *lastSlash = '\0';
index 808280b7e97ac5a1ebf36b3c30f15f418109ab02..24b9c41f2bb773ebcdd951a34f15bab7ebe98634 100644 (file)
@@ -228,7 +228,7 @@ DECLARE_API (MinidumpMode)
     DWORD_PTR Value=0;
 
     CMDValue arg[] =
-    {   // vptr, type
+    {   // vptr, type;
         {&Value, COHEX}
     };
 
@@ -10986,7 +10986,6 @@ DECLARE_API(Token2EE)
 {
     INIT_API();
     MINIDUMP_NOT_SUPPORTED();
-    ONLY_SUPPORTED_ON_WINDOWS_TARGET();
 
     StringHolder DllName;
     ULONG64 token = 0;
@@ -11012,7 +11011,7 @@ DECLARE_API(Token2EE)
     }
     if (nArg!=2)
     {
-        ExtOut("Usage: !Token2EE module_name mdToken\n");
+        ExtOut("Usage: " SOSPrefix "Token2EE module_name mdToken\n");
         ExtOut("       You can pass * for module_name to search all modules.\n");
         return Status;
     }
@@ -11051,7 +11050,7 @@ DECLARE_API(Token2EE)
             FileNameForModule(dwAddr, FileName);
 
             // We'd like a short form for this output
-            LPWSTR pszFilename = _wcsrchr (FileName, DIRECTORY_SEPARATOR_CHAR_W);
+            LPWSTR pszFilename = _wcsrchr (FileName, GetTargetDirectorySeparatorW());
             if (pszFilename == NULL)
             {
                 pszFilename = FileName;
@@ -11181,7 +11180,7 @@ DECLARE_API(Name2EE)
             FileNameForModule (dwAddr, FileName);
 
             // We'd like a short form for this output
-            LPWSTR pszFilename = _wcsrchr (FileName, DIRECTORY_SEPARATOR_CHAR_W);
+            LPWSTR pszFilename = _wcsrchr (FileName, GetTargetDirectorySeparatorW());
             if (pszFilename == NULL)
             {
                 pszFilename = FileName;
@@ -14887,25 +14886,26 @@ static HRESULT DumpMDInfoBuffer(DWORD_PTR dwStartAddr, DWORD Flags, ULONG64 Esp,
             }
         }
     }
-    ULONG Index;
+    ULONG index;
     ULONG64 base;
-    if (g_ExtSymbols->GetModuleByOffset(UL64_TO_CDA(addrInModule), 0, &Index, &base) == S_OK)
+    if (g_ExtSymbols->GetModuleByOffset(UL64_TO_CDA(addrInModule), 0, &index, &base) == S_OK)
     {
         ArrayHolder<char> szModuleName = new char[MAX_LONGPATH+1];
-        if (g_ExtSymbols->GetModuleNames(Index, base, NULL, 0, NULL, szModuleName, MAX_LONGPATH, NULL, NULL, 0, NULL) == S_OK)
+        if (g_ExtSymbols->GetModuleNames(index, base, NULL, 0, NULL, szModuleName, MAX_LONGPATH, NULL, NULL, 0, NULL) == S_OK)
         {
             MultiByteToWideChar (CP_ACP, 0, szModuleName, MAX_LONGPATH, wszNameBuffer, MAX_LONGPATH);
             DOAPPEND (wszNameBuffer);
             bModuleNameWorked = TRUE;
         }
     }
-    else
+    // If the dbgeng functions fail to get the module/assembly name, use the DAC API
+    if (!bModuleNameWorked)
     {
         if (g_sos->GetPEFileName(dmd.File, MAX_LONGPATH, wszNameBuffer, NULL) == S_OK)
         {
             if (wszNameBuffer[0] != W('\0'))
             {
-                WCHAR *pJustName = _wcsrchr(wszNameBuffer, DIRECTORY_SEPARATOR_CHAR_W);
+                WCHAR *pJustName = _wcsrchr(wszNameBuffer, GetTargetDirectorySeparatorW());
                 if (pJustName == NULL)
                     pJustName = wszNameBuffer - 1;
 
index b03b0d17714e2aa3664346ef3fcec1b0f72e51cb..837e37614207b3d0b3b69bf2038829c38f96563f 100644 (file)
@@ -234,6 +234,16 @@ ULONG DebuggeeType()
     return Class;
 }
 
+const WCHAR GetTargetDirectorySeparatorW()
+{
+    if (IsWindowsTarget()) {
+        return W('\\');
+    }
+    else {
+        return W('/');
+    }
+}
+
 #ifndef FEATURE_PAL
 
 // Check if a file exist
@@ -5189,7 +5199,7 @@ static void AddAssemblyName(WString& methodOutput, CLRDATA_ADDRESS mdesc)
                 {
                     if (wszFileName[0] != W('\0'))
                     {
-                        WCHAR *pJustName = _wcsrchr(wszFileName, DIRECTORY_SEPARATOR_CHAR_W);
+                        WCHAR *pJustName = _wcsrchr(wszFileName, GetTargetDirectorySeparatorW());
                         if (pJustName == NULL)
                             pJustName = wszFileName - 1;
                         methodOutput += (pJustName + 1);
index 54fcded0ed9dc2c116ba9369e6f7a1c6b98e08a7..305339b9f98a71de5e910c4c1ff8d8cf0666b516 100644 (file)
@@ -1761,6 +1761,7 @@ BOOL GetSOSVersion(VS_FIXEDFILEINFO *pFileInfo);
 #endif
 
 BOOL IsDumpFile ();
+const WCHAR GetTargetDirectorySeparatorW();
 
 // IsMiniDumpFile will return true if 1) we are in
 // a small format minidump, and g_InMinidumpSafeMode is true.