Может ли простая программа быть ответственна за BSOD?

StackOverflow https://stackoverflow.com/questions/1588471

  •  22-09-2019
  •  | 
  •  

Вопрос

У меня есть клиент, который сказал мне, что моя программа (простая пользовательская программа, а не драйвер) приводит к сбою его системы с Синий Экран Смерти (BSOD).Он говорит, что никогда не сталкивался с этим в других программах и что он может легко воспроизвести это в моей.

BSOD относится к типу CRITICAL_OBJECT_TERMINATION (0x000000F4) с типом объекта 0x3 (процесс):Процесс или поток, имеющий решающее значение для работы системы, неожиданно завершается.

Может ли простая программа быть ответственна за BSOD (даже в Vista ...) или он должен проверить установку оборудования или ОС?

Это было полезно?

Решение

Самый простой способ вызвать BSOD с помощью программы пользовательского пространства - это (afaik) завершите процесс подсистемы Windows (csrss.exe ).Для этого не требуется неисправное оборудование или ошибка в ядре или драйвере, ему нужны только права администратора1.

Что именно делает ваш код?Сообщение об ошибке ("Процесс или поток, имеющие решающее значение для работы системы, неожиданно завершены") звучит так, как будто один из основных системных процессов завершен.Может быть, вы убиваете процесс и непреднамеренно запустили неправильный процесс?

Если каким-то образом возможно, вы могли бы попытаться получить дамп памяти от этого клиента.Используя Средства отладки для Windows затем вы можете дополнительно проанализировать этот дамп, как описано здесь.

1Windows не мешает вам делая это потому что это "позволяет администраторам контролировать свой компьютер".Так что это сделано специально, а не ошибка.Прочтите статьи Рэймонда, и вы поймете, почему.

Другие советы

Просто потому, что ваша программа не является драйвером, это не значит, что она не будет использование водитель.

Теоретически, ваш код не должен вызывать BSOD на компьютере.Это зависит от операционной системы, чтобы убедиться, что этого не произойдет.По определению, это означает, что где-то есть проблема либо в аппаратном обеспечении, либо в коде, отличном от вашей программы.Однако это не исключает наличия ошибки и в вашем коде.

Короткий ответ - да.Длинный ответ зависит от того, что должна делать ваша программа и как она это делает?

Обычно этого не должно быть.Если это так, то должно быть либо

  • Ошибка в ядре Windows (возможна, но очень маловероятна)
  • Ошибка в драйвере устройства (не обязательно в устройстве, используемом вашей программой, это может стать довольно сложным)
  • Неисправность в аппаратном обеспечении

Я бы поставил на вариант номер два (драйвер устройства), но было бы интересно, если бы вы могли предоставить нам более подробный дамп.

Ну, да, это возможно - но по многим разным причинам.

Вот почему мы тестируем на разных машинах, операционных системах, оборудовании и т.д..

Установили ли вы какие-то требования для своей программы и соблюдает ли их ваш пользователь?

Если вы не можете скопировать его самостоятельно, и вашей программе не нужен администратор для запуска, я бы немного заподозрил

  • Стабильность аппаратного обеспечения этой системы
  • Состояние вируса / вредоносного ПО в этой системе.

Если вы можете получить физический доступ к клиентскому блоку, возможно, стоит выполнить полную проверку на вирусы с помощью современного сканера и запустить полный memtest ( проверка памяти ) на нем.

Когда-то у меня была система, которая казалась стабильной, за исключением того, что несколько программ на ней не запускались (и иногда приводили к сбою).Memtest показал, что в моей оперативной памяти есть несколько плохих битов, но они были в более мощных sims, поэтому доступ к ним был получен только в том случае, если программа пыталась использовать много оперативной памяти.

Нет, и это в значительной степени так по определению.Худшее, что вы можете сказать, это то, что пользовательское приложение, возможно, "запустило" ошибку Windows или драйвера.Но современная настольная операционная система полностью отвечает за свою собственную целостность;BSOD - это нарушение этой целостности.Следовательно, ответственность несет ОС, и только ОС.

(Пример ошибки BSOD, которую может обнаружить только ваше приложение:антивирусный сканер, реализованный в виде драйвера, который выходит из строя при запуске файла из сектора 0xFFFFFFFF, сектора, который на этом компьютере случайно содержит одну DLL вашего приложения)

У меня возникли проблемы при выходе из моего приложения без остановки всех процессов и подключений BD после завершения программы (я разбил всю IDE).Я помещаю код "остановка и отключение" в "Завершение" события "Form_Closed" моей основной формы, и проблема решена, я не знаю, что это ваша ситуация.

Другая проблема может возникнуть, если пользователь пытается получить доступ к тем же ресурсам, которые использует ваше приложение (базы данных, оборудование, сокеты и т.д.).Спросите его / ее о том, какие приложения он / она использует, когда происходит BSOD.

Вирус не может быть отброшен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top