Отладчик убивает приложение без объяснения причин (при вызове CryptoStream.ReadByte ()) - PullRequest
2 голосов
/ 06 октября 2011

РЕДАКТИРОВАТЬ: Я обнаружил проблему.

Конструктор для моего объекта инициализировал файловый поток в режиме записи независимо от того, собирались мы зашифровать или расшифровать файл. Несмотря на то, что поток файлов записи будет закрыт перед расшифровкой (другой поток файлов, используемый для этой цели), он все равно вызывает тихий сбой. Теперь работает нормально.

Так что это выглядит довольно обычной проблемой доступа к файлам. Жаль, что CryptoStream не воспринимает это как исключение.

Спасибо за предложения - я посмотрю на ProcDump и WinDbg .


Я только что создал небольшое приложение для чтения и дешифрования файла с локального жесткого диска.

Отладчик Visual Studio убивает приложение без каких-либо сообщений или объяснений вообще. Это происходит при выполнении строки read = crypto.ReadByte() в следующем коде.

            try
            {
                if (file != null)
                {
                    // the stream that was used for encryption
                    file.Close();
                }
                var provider = new DESCryptoServiceProvider();
                provider.Key = Key;
                provider.IV = Key;
                var ict = provider.CreateDecryptor();
                var bytes = new List<byte>();
                using (var stream = new FileStream(fileName, FileMode.Open))
                {
                    crypto = new CryptoStream(stream, ict, CryptoStreamMode.Read);
                    var decrypted = new MemoryStream();
                    Int32 read;
                    try
                    {
                        do
                        {
                            read = crypto.ReadByte(); // the application dies here
                            if (read != -1) bytes.Add(Convert.ToByte(read));
                        }
                        while (read != -1);
                    }
                    finally
                    {
                        // we never get here
                        decrypted.Close();
                    }

                };
                return ASCIIEncoding.ASCII.GetString(bytes.ToArray());
            }
            catch (Exception x)
            {
                // we never get here either                            
                crypto.Close();
                return x.Message;
            }

То, что я попробовал и исключил:

  1. Нет исключений. Мы никогда не вводим finally и catch. Я также включил Break when an exception is thrown, но это не имеет значения. Нет признаков какого-либо исключения.

  2. Публикация приложения (ClickOnce) и его запуск имеют тот же эффект.

  3. Новый перезапуск не имеет значения.

  4. Создание копии файла (в случае, если какой-то другой процесс блокировал доступ к нему и т. Д.) И попытка прочитать эту копию не удается аналогичным образом.

  5. Если я попытаюсь оценить crypto.ReadByte() в окне просмотра, я получу следующие сообщения в таком порядке:

    • This expression causes side effects and will not be evaluated;

    • когда я обновляю его: Function evaluation was aborted

    • когда я обновляю его или просто подожду несколько секунд: Unable to evaluate the expression. The object invoked has disconnected from its clients.

и приложение завершено, мы вернулись в Visual Studio.

В чем здесь проблема?

Ответы [ 2 ]

4 голосов
/ 06 октября 2011

Некоторые предложения:

  • Попробуйте использовать ProcDump с опцией -t в вашем приложении.Это должно создать файл дампа, когда ваше приложение выходит преждевременно.Попробуйте также другие варианты (например, -e ), если это не приводит к созданию полезного дампа.
  • Если это не сработает, попробуйте запустить приложение под WinDbg.
0 голосов
/ 07 мая 2016

я знаю, что уже слишком поздно для ответа, но, возможно, это поможет кому-то. У меня та же проблема, и этот ответ помогает мне Отладчик убивает приложение без объяснения причин (при вызове CryptoStream.ReadByte ())

если в вашем окне просмотра содержится сообщение об ошибке «Оценка функции была прервана». Это, вероятно, означает, что одно из отображаемых свойств имеет бесконечную рекурсию, например:

readonly bool isSigned;
public bool IsSigned { get { return IsSigned; } }

Исправьте бесконечную рекурсию, и проблема должна исчезнуть:

readonly bool isSigned;
public bool IsSigned { get { return isSigned; } }

Вы можете перехватить исключение StackOverflowException при его создании с помощью Visual Studio, выбрав в строке меню «Отладка» -> «Исключения» -> «Найти ...» -> тип «stackoverflow» -> установите флажок «Брошено» для System.StackOverflowException -> «ОК»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...