2009-10-19 17 views
8

Tengo un cliente que me dijo que mi programa (programa simple user-land, no un controlador) está bloqueando su sistema con un pantalla azul de la muerte (BSOD). Él dice que nunca se ha encontrado con otro programa y que puede reproducirlo fácilmente con el mío.¿Puede un programa simple ser responsable de un BSOD?

El BSOD es del tipo CRITICAL_OBJECT_TERMINATION (0x000000F4) con el tipo de objeto 0x3 (proceso): Un proceso o hilo crucial para el funcionamiento del sistema se ha cerrado inesperadamente o ha finalizado.

¿Puede un programa simple ser responsable de un BSOD (incluso en Vista ...) o debería verificar el hardware o la instalación del sistema operativo?

+0

Qué idioma está escrito en? –

+0

Es un programa en C++ que utiliza wxWidgets toolkit. – math

+0

@math: * podría * ser un error en wxWidgets que está dando algunos problemas a la API de Win. – voyager

Respuesta

5

La manera más fácil de causar un BSOD con un programa de espacio de usuario es (afaik) a kill the Windows subsystem process (csrss.exe). Esto no necesita hardware defectuoso ni un error en el núcleo o un controlador, solo necesita privilegios de administrador .

¿Qué está haciendo exactamente tu código? El mensaje de error ("Un proceso o hilo crucial para el funcionamiento del sistema se ha cerrado inesperadamente o se ha terminado") parece que se ha terminado uno de los procesos esenciales del sistema. ¿Tal vez estás matando un proceso y sin querer obtuviste el proceso equivocado?

Si de alguna manera es posible, podría tratar de obtener un volcado de memoria de ese cliente. Usando las herramientas de depuración para Windows, puede luego analizar ese volcado como se describe en here.

Windows no le impide doing so porque "keeps administrators in control of their computer". Así que esto es por diseño y no es un error. Lee los artículos de Raymond y verás por qué.

10

El hecho de que su programa no sea un controlador no significa que no va a usar un controlador.

En teoría, su código no debe poder BSOD la computadora. Depende del sistema operativo asegurarse de que eso no ocurra. Por definición, eso significa que hay un problema en algún lugar, ya sea en hardware o en código que no sea su programa. Sin embargo, eso no impide que haya un error en tu código.

+0

"En teoría"? Tal vez una palabra demasiado fuerte al describir Windows. No creo que haya una ciencia real que postule ninguna teoría sobre Windows. Creo que esto es más una esperanza que Microsoft alberga. Creo que la palabra correcta podría ser "con suerte". –

+9

S.Lott: Supongo que lo que quería decir es que en el modo protegido x86, el anillo 3 no debería poder quitar el anillo 0. Esto no tiene nada que ver con Windows. –

4

La respuesta breve es sí. La respuesta larga depende de qué se supone que haga su programa y cómo lo hace.

3

Bueno, sí se puede, pero por muchas razones diferentes.

Es por eso que ponemos a prueba en diferentes máquinas, sistemas operativos, hardware, etc ..

se ha marcado algunos requisitos para su programa y es el usuario después de ellos?

4

Normalmente, no debería. Si lo hace, debe ser

  • Un error en el kernel de Windows (posible, pero muy improbable)
  • Un error en un controlador de dispositivo (no necesariamente en un dispositivo utiliza su programa, esto podría llegar a ser muy complicado)
  • un fallo en el hardware

yo apuesto por la opción número dos (controlador de dispositivo), pero sería interesante si nos pudiera obtener un volcado más detallada.

+0

+1: ¿Un error en Windows? De Verdad? ¿Quién hubiera pensado en eso? –

+4

@ S.Lott: Sorprendentemente ya pesar de todos los chistes de Windows, pero los pocos BSOD que he visto desde Windows XP pueden ser rastreados hasta productos de terceros o fallas de hardware. –

+0

@divo: Buen punto. Sin embargo, cuando un producto de terceros puede bloquear Windows, sospecho que todavía hay un error en algún lugar fuera del componente de terceros. –

1

Si no se puede duplicar por sí mismo, y su programa no necesita administrador para funcionar, me gustaría ser un poco acerca suspicous

  • La estabilidad del hardware del sistema que
  • El virus/estado de malware de ese sistema.

Si usted puede conseguir el acceso físico a la máquina cliente, podría valer la pena realizar una exploración completa del virus con un escáner de hasta al día, y la ejecución de un total memtest en él.

Tuve un sistema que una vez pareció estable, excepto que unos pocos programas no se ejecutarían en él (y que a veces bloquearía la caja). Memtest mostró que mi RAM tenía algunas partes malas, pero estaban en sims más altos, por lo que solo se accedía si un programa intentaba usar mucha RAM.

+0

Sí, puede ser una falla de hardware. –

1

No, y eso es más o menos por definición. Lo peor que puedes decir es que una aplicación user-land puede haber "disparado" un error de Windows o un error del controlador. Pero un sistema operativo de escritorio moderno es totalmente responsable de su propia integridad; un BSOD es una falla de esa integridad. Por lo tanto, el sistema operativo es responsable, y solo el sistema operativo.

(Ejemplo de un error BSOD que solo su aplicación podría exponer: un antivirus implementado como un controlador, que se bloquea al ejecutar un archivo del sector 0xFFFFFFFF, un sector que en esta máquina solo contiene una DLL de su aplicación)

+0

No diría que solo el sistema operativo es responsable. Ciertamente, el sistema operativo debe ser imposible de separar de una aplicación no privilegiada, pero tenemos que lidiar con sistemas operativos de la vida real. –

+0

Los errores del sistema operativo son un hecho indiscutible, pero esa observación no quita nada de la responsabilidad. – MSalters

-1

Tuve problemas al salir de mi aplicación sin detener todos los procesos y conexiones de BD cuando el programa finaliza (bloqueé todo el IDE). Coloco el código de "detención y desconexión" en el evento "Terminar" del "Formulario cerrado" de mi formulario principal y el problema se resolvió, no sé si esta es su situación.

Otro problema puede ser si el usuario está tratando de acceder a los mismos recursos que usa su aplicación (bases de datos, hardware, enchufes, etc.). Pregúntale qué aplicaciones está usando cuando ocurre el BSOD.

No se puede descartar un virus.

+0

Es curioso cómo una respuesta puede recoger un voto negativo ocho años después (¡yo era tan joven en ese entonces!) –

-1

Aquí es un simple programa de línea de comandos de C# que causa un BSOD

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

Esto ya fue mencionado por la respuesta aceptada, hace ocho años. – duskwuff

Cuestiones relacionadas