Moja aplikacja C# wysyła mi ślad stosu, gdy zgłasza nieobsługiwany wyjątek, a teraz patrzę na taki, którego nie rozumiem.Czy możesz wyjaśnić tę dziwaczną awarię w środowisku wykonawczym .NET?
Wygląda na to, że to nie może być moja wina, ale zazwyczaj kiedy myślę, że później okazałem się nie tak. 8-) Oto ślad stosu:
mscorlib caused an exception (ArgumentOutOfRangeException): startIndex cannot be larger than length of string.
Parameter name: startIndex
System.String::InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy) + 6c
System.String::Substring(Int32 startIndex) + 0
System.IO.Directory::InternalGetFileDirectoryNames(String path, String userPathOriginal, String searchPattern, Boolean includeFiles, Boolean includeDirs, SearchOption searchOption) + 149
System.IO.Directory::GetFiles(String path, String searchPattern, SearchOption searchOption) + 1c
System.IO.Directory::GetFiles(String path) + 0
EntrianSourceSearch.Index::zz18ez() + 19b
EntrianSourceSearch.Index::zz18dz() + a
Więc moja Kodeksu (ukrywane nazwy funkcji na końcu) wzywa System.IO.Directory.GetFiles(path)
który zderza się z problemem indeksowania ciąg.
Niestety nie znam wartości path
, która została przekazana, ale niezależnie od tego, na pewno nie powinno być możliwe, aby System.IO.Directory::GetFiles
zawiesił się w ten sposób? Spróbuj, jak mogę, nie mogę wymyślić żadnego argumentu do GetFiles
, który odtwarza awarię.
Czy naprawdę patrzę na błąd w środowisku wykonawczym .NET, czy jest coś, co może legalnie powodować ten wyjątek? (Mogę zrozumieć rzeczy dzieje się źle, jeśli katalog był zmieniony w czasie zadzwoniłem GetFiles
, ale nie spodziewałbym wyjątek indeksowania ciąg w tym przypadku).
Edit: Dzięki wszystkim za ich myśli! Najbardziej prawdopodobną do tej pory teorią jest to, że istnieje ścieżka z podejrzanymi znakami Unicode nie-BMP, ale nadal nie mogę jej złamać. Patrząc na kod w GetFiles
z Reflectorem, myślę, że jedynym sposobem jego złamania jest, aby GetDirectoryName()
zwrócił ścieżkę o numerze dłuższą o niż swoje wejście, nawet jeśli wejście jest już w pełni znormalizowane. Dziwaczny. Próbowałem tworzyć ścieżki zawierające znaki spoza BMP (nigdy przedtem nie miałem katalogu o nazwie {MUSICAL SYMBOL G CLEF}), ale nadal nie mogę go złamać.
To, co zrobiłem, to dodać dodatkowe rejestrowanie wokół błędnego kodu (i upewnić się, że moje logowanie działa na znakach innych niż BMP!). Jeśli to się powtórzy, będę miał o wiele więcej informacji.
Być może próbuje on spojrzeć na katalog z uszkodzonymi nazwami plików? –
Jaka jest wartość parametru w System.IO.Directory:: GetFiles(String path) + 0? – Yakeen
Czy twoja aplikacja zawiera dowolny natywny kod? –