例外をキャプチャした .Net アプリケーション ダンプがあります。windbg を使用して分析しており、メソッドの 1 つで 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 終端を考慮しますか? また、私が見つけられなかった何かを見つけることができれば、他に何か問題があるという事実にもオープンです。