У меня есть дамп приложения .Net, в котором зафиксировано исключение, я анализирую с помощью windbg и интересуюсь значением параметра String в одном из методов. Я изолировал объект String. Моя работа windbg:
0:000> .loadby sos mscorwks
0:000> !dso
OS Thread Id: 0x16f0 (0)
RSP/REG Object Name
00000000001fe908 000000000f011440 System.AppDomainSetup
00000000001fe918 000000000f0335f8 System.ArgumentException
00000000001fe920 000000000f011b60 System.String
0:000> !do 000000000f011b60
Name: System.String
MethodTable: 000007feef477a80
EEClass: 000007feef07e530
Size: 538(0x21a) bytes
(C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll)
String: C:\Windows\Installer\MSI2D87.tmp
Fields:
MT Field Offset Type VT Attr Value Name
000007feef47ecf0 4000096 8 System.Int32 1 instance 257 m_arrayLength
000007feef47ecf0 4000097 c System.Int32 1 instance 179 m_stringLength
000007feef4794c8 4000098 10 System.Char 1 instance 43 m_firstChar
000007feef477a80 4000099 20 System.String 0 shared static Empty
>> Domain:Value 00000000029d02d0:000000000f011308 <<
000007feef479378 400009a 28 System.Char[] 0 shared static WhitespaceChars
>> Domain:Value 00000000029d02d0:000000000f0121f8 <<
Переменная-член m_stringLength указывает, что длина строки составляет 179 символов, однако при проверке строки кажется, что она состоит всего из 32 символов. Глядя на память для этой строки, кажется, что она завершается NULL. После NULL завершающего символа идут еще символы. Это может быть повторно используемая память или повреждение строки, однако путь выглядит правильным, как показано. Возникает исключение: «Недопустимые символы в пути», но на этом пути нет недопустимых символов. Итак, стек вызовов для этого исключения:
0:000> !CLRStack
OS Thread Id: 0xbac (0)
Child-SP RetAddr Call Site
000000000021e9a0 000007feeea64dec System.IO.Path.CheckInvalidPathChars(System.String)
000000000021e9e0 000007feee9c0e66 System.IO.Path.NormalizePathFast(System.String, Boolean)
000000000021eaa0 000007feee9badf8 System.AppDomainSetup.NormalizePath(System.String, Boolean)
000000000021eb10 000007feeea630ad System.AppDomainSetup.SetupDefaultApplicationBase(System.String)
000000000021eb70 000007feee9bb27b System.AppDomain.SetupFusionStore(System.AppDomainSetup)
000000000021ebc0 000007feef87d4a2 System.AppDomain.SetupDomain(Boolean, System.String, System.String)
Обрабатывает ли метод System.IO.Path.CheckInvalidPathChars строку, используя длину, найденную в m_stringLength, или он принимает во внимание завершение NULL в самой строке? Я также открыт для того, что что-то еще не так, если вы заметили то, чего не заметил я.