2009-10-19 4 views
8

Ich habe einen Kunden, der mir sagte, dass mein Programm (einfaches Benutzer-Land-Programm, kein Treiber) sein System mit einem Blue Screen Of Death (BSOD) stürzt. Er sagt, dass er das nie mit anderen Programmen angegangen ist und dass er es leicht mit mir reproduzieren kann.Kann ein einfaches Programm für einen BSOD verantwortlich sein?

Der BSOD ist vom Typ CRITICAL_OBJECT_TERMINATION (0x000000F4) mit Objekttyp 0x3 (Prozess): Ein für den Systembetrieb entscheidender Prozess oder Thread ist 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?

+0

Welche Sprache es geschrieben ist? –

+0

Es ist ein C++ - Programm mit WxWidgets Toolkit. – math

+0

@math: es * könnte * ein Fehler in wxWidgets sein, der der Win API einige Probleme bereitet. – voyager

Antwort

5

Der einfachste Weg, einen BSOD mit einem User-Space-Programm zu verursachen, ist (afaik) zu kill the Windows subsystem process (csrss.exe). Dies erfordert keine fehlerhafte Hardware oder einen Fehler im Kernel oder einen Treiber, es benötigt nur Administratorrechte .

Was macht Ihr Code genau? 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 irgendwie möglich könnten Sie versuchen, einen Speicherabbild von diesem Kunden zu erhalten. Mit Hilfe der Debugging-Tools für Windows können Sie diesen Dump dann wie beschrieben here weiter analysieren.

Windows verhindert Sie nicht von doing so, weil es "keeps administrators in control of their computer" ist. Das ist also ein Design und kein Bug. Lesen Sie Raymonds Artikel und Sie werden sehen, warum.

10

Nur weil Ihr Programm nicht ein Treiber ist, bedeutet nicht, dass es nicht einen Treiber verwenden.

In der Theorie sollte Ihr Code nicht in der Lage sein, den Computer zu BSOD. 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.

+0

"In der Theorie"? Vielleicht ein zu starkes Wort bei der Beschreibung von Windows. Ich glaube nicht, dass es eine echte Wissenschaft gibt, die irgendwelche Theorien über Windows postuliert. Ich denke, das ist eher eine Hoffnung, die Microsoft hegt. Ich denke, das richtige Wort könnte "Hoffentlich" sein. –

+9

S.Lott: Ich nehme an, was er im x86-geschützten Modus meinte, Ring 3 sollte Ring 0 nicht ausschalten können. Das hat nichts mit Windows zu tun. –

4

Kurze Antwort ist ja. Lange Antwort hängt davon ab, was Sie Programm tun soll und wie es das tut?

3

Nun, ja, es kann - aber aus vielen verschiedenen Gründen.

Deshalb haben wir auf verschiedenen Maschinen zu testen, Betriebssysteme, Hardware etc ..

Haben Sie einige Anforderungen für das Programm festgelegt und ist Ihr Benutzer nach ihnen?

4

Normalerweise sollte es nicht. Ist dies der Fall, muss es entweder

  • Ein Fehler im Windows-Kernel (möglich, aber sehr unwahrscheinlich)
  • Ein Fehler in einem Gerätetreiber (nicht unbedingt in einem Gerät Ihr Programm verwendet, könnte dies recht kompliziert)
  • ein Fehler in der Hardware

ich auf Option Nummer zwei (Gerätetreiber) setzen würde, aber es wäre interessant, wenn Sie uns eine detailliertere Dump erhalten könnten.

+0

+1: Ein Fehler in Windows? "Ja wirklich?" Wer hätte das gedacht? –

+4

@ S.Lott: Überraschenderweise und trotz all dieser Windows-Witze, aber die wenigen BSOD, die ich seit Windows XP gesehen habe, könnten alle auf Produkte von Drittanbietern oder Hardware-Fehler zurückzuführen sein. –

+0

@ divo: Guter Punkt. Wenn jedoch ein Drittanbieterprodukt Windows abstürzen kann, vermute ich, dass irgendwo außerhalb der 3rd-Party-Komponente noch ein Fehler liegt. –

1

Wenn Sie es nicht vervielfältigen sich, und Ihr Programm nicht Admin ausführen müssen, ich ein wenig sein würde suspicous über

  • Die Stabilität dieser Hardware des Systems
  • Das Virus/Malware-Status dieses Systems.

Wenn Sie physischen Zugriff auf den Client-Box zu bekommen, könnte es sich lohnen, einen vollständigen Virenscan mit einer up-to-date-Scanner ausgeführt wird, und eine vollständige memtest darauf läuft.

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 bringen würde). 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.

+0

Ja, es kann ein Hardwarefehler sein. –

1

Nein, und das ist per Definition. 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 eines BSOD-Fehlers, den Ihre Anwendung allein aufdecken könnte: ein als Treiber implementierter Virenscanner, der beim Ausführen einer Datei aus dem Sektor 0xFFFFFFFF abstürzt, einem Sektor, der auf dieser einen Maschine zufällig nur eine DLL von Ihrem enthält Anwendung)

+0

Ich würde nicht sagen, nur das OS ist verantwortlich. Sicherlich sollte das Betriebssystem nicht von einer nicht-privilegierten App entfernt sein, aber wir müssen uns mit realen Betriebssystemen beschäftigen. –

+0

OS Bugs sind eine unbestreitbare Tatsache, aber diese Beobachtung entzieht der Verantwortung nichts. – MSalters

-1

Ich hatte Probleme beim Beenden meiner App, ohne alle Prozesse und BD-Verbindungen zu beenden, wenn das Programm endet (ich habe die gesamte IDE abgestürzt). Ich setze den "stopping 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 sein, 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.

+0

Lustig, wie eine Antwort eine negative Stimme acht Jahre später sammeln kann (ich war damals so jung!) –

-1

Hier ist ein einfaches C# Kommandozeilen-Programm, das eine BSOD verursacht

using System; 
using System.Diagnostics; 
class program 
{ 
    static void Main() 
    { 
     ProcessStartInfo proc = new ProcessStartInfo(); 
     proc.FileName = "cmd.exe"; 
     proc.Arguments = "/c wmic process where name='csrss.exe' delete"; 
     proc.Verb = "runas"; 
     Process.Start(proc); 
    } 
} 
+0

Dies wurde bereits von der angenommenen Antwort - vor acht Jahren - erwähnt. – duskwuff

Verwandte Themen