Могу ли я предотвратить недопустимые имена файлов минидампа

У меня есть приложение WinForms (.NET C#) OLTP на основе Oracle.

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

После того, как в одном и том же каталоге было создано множество таких мини-дампов, внезапно мини-дампы начинают получать довольно странные имена файлов, имена файлов, которые, по-видимому, «незаконны» в Windows.

Например, у нас есть такое имя файла: «°÷ƒ _minidump_default_pid_20248_tid_x19AC_2015_9_1_8_31_51.dmp»

И да, возврат каретки является ЧАСТЬЮ имени файла.

Мы обнаружили это, потому что log4net наблюдает за каталогом и внезапно начинает выдавать необработанные исключения из-за этих недопустимых имен файлов.

Итак, мы пытаемся выяснить, почему в первую очередь создается мини-дамп, но вопрос здесь в том, можем ли мы каким-то образом предотвратить создание мини-дампа с недопустимым именем файла или иным образом контролировать процесс именования?

Во-вторых, кто-нибудь знает, почему вообще возможно создавать недопустимые имена файлов?

Обновление: Для тех, кто просматривает это, пытаясь понять, почему файлы дампа создаются в первую очередь, наша проблема заключалась в том, что Windows создавала их, когда ей почти не хватало памяти, но по какой-то причине мы бы не всегда получали исключение OOMException.


person Esben Bach    schedule 01.09.2015    source источник


Ответы (1)


Во-первых, вы действительно должны попытаться выяснить, как генерируются эти дампы. Microsoft, например. предоставляет удобный способ использования ключа реестра с именем LocalDumps, который мне очень помог. Я уверен, что этот подход не будет генерировать недопустимые имена файлов, как указано выше.

Во-вторых, если приложение не аварийно завершает работу, возможно, оно зарегистрировало обработчик необработанных исключений. Это в основном нормально и предназначено для записи аварийных дампов, но необработанное исключение обрабатывается самим аварийным процессом. Как код, обрабатывающий ситуацию, может быть уверен, что сбой не затронет его самого? Лучший вариант — позволить Windows как операционной системе справиться со сбоем. Тогда ядро ​​Windows (которое не пострадало от сбоя) действительно может справиться с ситуацией. Это то, что делает LocalDumps.

В-третьих, в Windows возможен прямой доступ к файловой системе через пути, начинающиеся с \\.\ при передаче их в Windows API. Запуск такого пути пропустит любую проверку имени файла, чтобы вы могли создавать файлы с зарезервированными символами, такими как *, ?, : или новые строки, как вы заметили. Вероятно, это делает обработчик необработанных исключений вашего приложения, и сбой которого влияет на то, что части имени файла перезаписываются.

Chkdsk должен уметь восстанавливать файловую систему.

person Thomas Weller    schedule 03.09.2015
comment
Самое смешное, что мой обработчик необработанных исключений не генерирует дампы. По сути, это просто отображение исключения (вместе с трассировкой стека) в окне сообщений + регистрация исключения в log4net. Кроме того, кажется, что после этого приложение не падает, поэтому это не фатальное исключение, такое как StackOverflowException или что-то в этом роде. Мы рассмотрим изменение местоположения LocalDumps и посмотрим, произойдет ли то же самое. - person Esben Bach; 07.09.2015
comment
Все еще пытаюсь выяснить, что именно вызывает создание минидампов (поскольку это не наш код), но настройка ключа реестра, как описано в ссылке, похоже, устранила проблему генерации недопустимого имени файла. - person Esben Bach; 09.09.2015