Ich habe einen Kunden, der mir gesagt hat, dass mein Programm (einfaches Benutzer-Land-Programm, kein Treiber) sein System mit einem Blauen Bildschirm des Todes (BSOD) stürzt. Er sagt, dass er das nie mit anderen Programmen angegangen ist und dass er es einfach mit mir reproduzieren kann.
Der BSOD ist vom Typ CRITICAL_OBJECT_TERMINATION ( 0x000000F4
) mit dem Objekttyp 0x3
(Prozess): Ein Prozess oder Thread, der für die Systemoperation entscheidend ist, wurde unerwartet beendet oder wurde beendet.
Kann ein einfaches Programm für einen BSOD verantwortlich sein (auch unter Vista ...) oder sollte er die Hardware- oder Betriebssysteminstallation überprüfen?
Der einfachste Weg, um einen BSOD mit einem User-Space-Programm zu verursachen, ist (afaik) zu kill das Windows-Subsystem-Prozess (csrss.exe). Dies benötigt weder fehlerhafte Hardware noch einen Fehler im Kernel oder Treiber, es benötigt nur Administratorrechte 1 .
Was genau macht dein Code? Die Fehlermeldung ("Ein Prozess oder Thread, der für den Systembetrieb entscheidend ist, wurde unerwartet beendet oder wurde beendet.") Klingt wie einer der wesentlichen Systemprozesse, die beendet wurden. Vielleicht tötest du einen Prozess und hast unbeabsichtigt den falschen Prozess bekommen?
Wenn es irgendwie möglich ist, könnten Sie versuchen, einen Speicherabzug von diesem Kunden zu bekommen. Mit den Debugging-Tools für Windows können Sie diesen Speicherauszug weiter analysieren, wie in hier .
1 Windows hindert Sie nicht daran dies zu tun , weil "Administratoren die Kontrolle über ihren Computer behalten" . Das ist also ein Design und kein Bug. Lies Raymonds Artikel und du wirst sehen warum.
Nur weil Ihr Programm kein Treiber ist, heißt das nicht, dass es keinen > Treiber verwendet.
In der Theorie sollte Ihr Code nicht in der Lage sein, den Computer zu BSOD zu machen. Es ist Sache des Betriebssystems, dafür zu sorgen, dass dies nicht geschieht. Per Definition bedeutet das, dass es irgendwo ein Problem gibt, entweder in Hardware oder in anderem Code als Ihrem Programm. Das schließt jedoch nicht aus, dass es auch einen Fehler in deinem Code gibt.
Kurze Antwort ist ja. Lange Antwort hängt davon ab, was Sie Programm tun soll und wie es tut?
Normalerweise sollte es nicht. Wenn dies der Fall ist, muss entweder
vorhanden seinIch würde auf Option Nummer zwei (Gerätetreiber) wetten, aber es wäre interessant, wenn Sie uns einen detaillierteren Speicherabzug bringen könnten.
Wenn du es nicht selbst duplizieren kannst, und dein Programm keinen Admin benötigt, um zu laufen, wäre ich ein bisschen verdächtig gegenüber
Wenn Sie physischen Zugriff auf die Client-Box erhalten, ist es möglicherweise sinnvoll, einen vollständigen Virenscan mit einem aktuellen Scanner auszuführen und einen vollständigen memtest darauf.
Ich hatte einmal ein System, das stabil schien, außer dass ein paar wenige Programme nicht darauf laufen würden (und manchmal die Box zum Absturz brachten). Memtest zeigte, dass mein RAM einige schlechte Bits hatte, aber sie waren in höheren Sims, so dass sie nur zugegriffen wurden, wenn ein Programm versuchte, viel RAM zu verwenden.
Nein, und das ist so ziemlich per definitionem. Das Schlimmste, was Sie sagen können, ist, dass eine Benutzerland-Anwendung einen Windows-Fehler oder einen Treiber-Fehler "ausgelöst" hat. Aber ein modernes Desktop-Betriebssystem ist voll verantwortlich für seine eigene Integrität; Ein BSOD ist ein Versagen dieser Integrität. Daher ist das Betriebssystem verantwortlich und nur das Betriebssystem.
(Beispiel für einen BSOD-Fehler, den Ihre Anwendung allein aufdecken könnte: ein als Treiber implementierter Virenscanner, der beim Ausführen einer Datei aus Sektor 0xFFFFFFFF abstürzt, einem Sektor, der auf dieser einen Maschine zufällig nur eine DLL Ihrer Anwendung enthält )
Ich hatte Probleme beim Beenden meiner App, ohne alle Prozesse und BD-Verbindungen zu beenden, wenn das Programm beendet wurde (ich habe die gesamte IDE abgestürzt). Ich setze den "stop and disconnecting" Code in das "Terminate" von "Form_Closed" Event meines Hauptformulars und das Problem wurde gelöst, ich weiß es nicht, das ist deine Situation.
Ein weiteres Problem kann auftreten, wenn der Benutzer versucht, auf dieselben Ressourcen zuzugreifen, die Ihre App verwendet (Datenbanken, Hardware, Sockets usw.). Fragen Sie ihn / sie darüber, welche Apps er / sie benutzt, wenn der BSOD passiert.
Ein Virus kann nicht verworfen werden.
Hier ist ein einfaches c # -Kommandozeilenprogramm, das einen BSOD
verursacht %Vor%