mio C# applicazione mi manda una traccia dello stack quando viene generata un'eccezione non gestita, e sto guardando uno, ora che non capisco.Puoi spiegare questo bizzarro crash nel runtime .NET?
Sembra che questo non possa essere colpa mia, ma di solito quando penso che in seguito mi sono sbagliato. 8-) Ecco la traccia dello stack:
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
Quindi il mio codice (i nomi delle funzioni offuscati alla fine) chiama System.IO.Directory.GetFiles(path)
che blocca con un problema stringa di indicizzazione.
Purtroppo non so il valore di path
che è stato passato in, ma a prescindere che, sicuramente non dovrebbe essere possibile per System.IO.Directory::GetFiles
crash del genere? Prova come potrei non riuscire a trovare alcun argomento a GetFiles
che riproduce l'arresto anomalo.
Sono davvero guardando un bug nel runtime .NET, o c'è qualcosa che potrebbe legittimamente causare questa eccezione? (Ho potuto capire le cose andare male se la directory è in corso di modifica, al momento ho chiamato GetFiles
, ma non mi aspetto un'eccezione indicizzazione stringa in questo caso.)
Edit: Grazie a tutti per i loro pensieri! La teoria più probabile è che ci sia un pathname con caratteri dodgy non-BMP Unicode, ma non riesco ancora a farlo. Guardando il codice in GetFiles
con Reflector, penso che l'unico modo in cui si può rompere è per GetDirectoryName()
per tornare un percorso che è più rispetto al suo ingresso, anche quando il suo ingresso è già completamente normalizzata. Bizzarro. Ho provato a fare i nomi di percorso con caratteri non BMP in (non ho mai avuto una directory chiamata {Simbolo musicale G CLEF} prima 8-), ma non riesco ancora a farlo rompere.
Quello che ho fatto è aggiungere la registrazione aggiuntiva intorno al codice mancanza (e hanno fatto sì che la mia registrazione funziona con caratteri non BMP!). Se succede di nuovo, avrò molte più informazioni.
Forse sta cercando di guardare una directory con nomi di file corrotti? –
Qual è il valore del parametro in System.IO.Directory::GetFiles(String path) + 0? – Yakeen
La tua applicazione incorpora un codice nativo? –