Есть обычное Win32 .NET приложение, которое на нескольких машинах в определенный момент падает. При этом падает без всяких сообщений, записей в логах и т.п. Просто в один прекрасный момент оно перестает работать. Используя SOS мы получили дампы нескольких таких "silent crashes". Дамп всегда содержит в момент падения First chance Exception: Shutdown exception, один поток и абсолютно произвольный stack trace (при этом поток тоже случайный, может быть как managed так и unmanaged). Вопрос: что мы можем сделать, чтобы определить причину падений и отчего подобные проблемы возникнуть?
Наверху самом видели тему ? http://wasm.ru/forum/viewtopic.php?id=32181 Хотя хз имеет ли это отношение к .NET никогда им не занимался...
Да это может быть что угодно, начиная от защиты, заканчивая вирусом и продолжая кривостю говно.NET'а и рук говно.NET-скриптеров. Выкладывай приложение, может кто поможет.
Думаю, выкладывание приложения вряд ли поможет - это достаточно объемный продукт и какая именно часть вызывает падения - неизвестно. При этом приложение тестировалось и работало на более чем сотне разных компьютеров, проблемы возникают только на 3 машинах и в произвольное время (могут через 2 часа, а могут через 2 дня). Главный вопрос - какой инструментарий и подходы мы можем использовать, чтобы идентифицировать причину.
Можно написать простейшую тулзу. Смысл в том, что при многих событиях и при всех исключениях посылается сообщение на отладочный порт, если он имеется. Для этого служит дебугапи)http://msdn.microsoft.com/en-us/library/ms679303(VS.85).aspx). Тоесть нужно подключить отладчик(нашу тулзу) который будет фильтровать исключения и вести лог. В случае если процесс завершается, или возникло какоето исключение, которого не должно быть, тогда остановить процесс, отключить наш отладчик и подключить норальный, туже олю. Это подходит для юзермодных приложений, где не используется защита от отладки. Для своего приложения просто все исключения обработать. Не понятно в чём проблема. Финальный обработчик исключений зарегистрировать к примеру и из него вести лог или подключать отладчик.
Мы так и делаем - подключаем SOS отладчик. Проблема в том, что нет исключений, кроме ShutDown_Exception - в момент которого понять что-то невозможно, тк. все уже позавершалось.
dockay1 Я не знаю что такое "SOS" и "ShutDown_Exception". Наверно это какойто жалкий функционал предоставляемый компилятором. Поток обработает исключение в любом случае, за исключением невозможности обращения к стеку, так как не валидный Esp, либо сегментный регистр Ss содержит значение отличное от стандартного. В этом случае процесс будет завершон ядром, но всёравно будет послано сообщение дебаггеру. Вы не так делаете.
Мjжно посмотреть в сторону debugdiag, мощная тулень, там кроме прочего есть crash/hang analyze + вроде бы даже умеет по дампам .net стеки раскручивать..
имхо, если падает без ошибок, тихо - то никаких эксепшенов там и не будет. Просто внутри есть какой-то механизм завершения (не хватило памяти - выходим. Не удалось создать файл - выходим. И тому подобное. По какой-то причине, авторы ЗАБЫЛИ выдать большую табличку "В вашем жалком компуктере не хватает памяти для ...", а просто втихую терминируют все. Вот примерно в эту сторону я бы и копал. Вариант с памятью кажется наиболее вероятным но можно и еще придумать.