2009-10-19 31 views
8

Tôi có một khách hàng nói với tôi rằng chương trình của tôi (chương trình người dùng đơn giản, không phải người lái xe) đang treo hệ thống của mình với Màn hình xanh chết (BSOD). Anh ấy nói anh ấy chưa bao giờ gặp điều đó với chương trình khác và anh ấy có thể tái tạo nó dễ dàng với tôi.Chương trình đơn giản có thể chịu trách nhiệm về BSOD không?

BSOD thuộc loại CRITICAL_OBJECT_TERMINATION (0x000000F4) với loại đối tượng 0x3 (quy trình): Quy trình hoặc chuỗi quan trọng đối với hoạt động của hệ thống đã thoát hoặc bị đột xuất bất ngờ.

Chương trình đơn giản có thể chịu trách nhiệm về BSOD (ngay cả trên Vista ...) hay bạn nên kiểm tra cài đặt phần cứng hoặc hệ điều hành?

+0

Ngôn ngữ nào là nó viết bằng? –

+0

Đây là chương trình C++ sử dụng bộ công cụ wxWidgets. – math

+0

@math: nó * có thể * là một lỗi trong wxWidgets đang đưa ra một số vấn đề đối với API Win. – voyager

Trả lời

5

Cách dễ nhất để gây ra BSOD bằng chương trình không gian người dùng là (afaik) đến kill the Windows subsystem process (csrss.exe). Điều này không cần phần cứng bị lỗi hoặc lỗi trong nhân hoặc trình điều khiển, nó chỉ cần quyền quản trị viên .

Mã của bạn chính xác là gì? Thông báo lỗi ("Một quá trình hoặc chuỗi rất quan trọng đối với hoạt động của hệ thống đã thoát hoặc bị kết thúc bất ngờ"). Âm thanh giống như một trong các quy trình hệ thống cơ bản bị chấm dứt. Có lẽ bạn đang giết chết một quá trình và vô ý có quá trình sai?

Nếu bằng cách nào đó bạn có thể thử lấy một kết xuất bộ nhớ từ khách hàng đó. Sử dụng các công cụ gỡ lỗi cho Windows, bạn có thể phân tích thêm phân đoạn đó như được mô tả here.

Windows không ngăn bạn từ doing so vì nó "keeps administrators in control of their computer". Vì vậy, điều này là do thiết kế và không phải là một lỗi. Đọc bài viết của Raymond và bạn sẽ thấy tại sao.

10

Chỉ vì chương trình của bạn không phải là tài xế không có nghĩa là nó sẽ không sử dụng trình điều khiển.

Về lý thuyết, mã của bạn không được phép BSOD máy tính. Đó là vào hệ điều hành để đảm bảo rằng không xảy ra. Theo định nghĩa, điều đó có nghĩa là có một vấn đề ở đâu đó trong phần cứng hoặc trong mã khác với chương trình của bạn. Điều đó không ngăn cản có một lỗi trong mã của bạn là tốt mặc dù.

+0

"Về lý thuyết"? Có thể một từ quá mạnh khi mô tả Windows. Tôi không nghĩ rằng có một khoa học thực sự mô phỏng bất kỳ lý thuyết nào về Windows. Tôi nghĩ rằng đây là một niềm hy vọng mà Microsoft mong muốn. Tôi nghĩ từ đúng có thể là "Hy vọng". –

+9

S.Lott: Tôi cho rằng ý anh ta là ở chế độ được bảo vệ x86, vòng 3 không thể hạ gục vòng 0. Điều này không liên quan gì đến Windows. –

4

Câu trả lời ngắn gọn là có. Câu trả lời dài phụ thuộc vào chương trình của bạn là giả sử để làm và nó như thế nào?

3

Vâng, có thể - nhưng vì nhiều lý do khác nhau.

Đó là lý do tại sao chúng tôi kiểm tra trên các máy khác nhau, hệ điều hành, phần cứng vv ..

Bạn đã thiết lập một số yêu cầu cho chương trình của bạn và là người dùng của bạn sau đó?

4

Thông thường, không nên. Nếu có, thì phải có một trong hai

  • Một lỗi trong nhân Windows (có thể nhưng rất khó xảy ra)
  • Một lỗi trong một trình điều khiển thiết bị (không nhất thiết trong một thiết bị chương trình của bạn sử dụng, điều này có thể nhận được khá phức tạp)
  • một lỗi trong phần cứng

tôi sẽ đặt cược vào tùy chọn thứ hai (trình điều khiển thiết bị) nhưng nó sẽ rất thú vị nếu bạn có thể đưa chúng ta một bãi chứa chi tiết hơn.

+0

+1: Lỗi trong cửa sổ? Có thật không? Ai có thể nghĩ về điều đó? –

+4

@ S.Lott: Đáng ngạc nhiên và mặc dù tất cả những câu chuyện đùa của Windows, nhưng vài BSOD tôi đã thấy kể từ khi Windows XP tất cả có thể được truy tìm đến các sản phẩm của bên thứ ba hoặc lỗi phần cứng. –

+0

@divo: Tốt. Tuy nhiên, khi một sản phẩm của bên thứ 3 có thể làm hỏng Windows, tôi nghi ngờ vẫn còn một lỗi ở đâu đó bên ngoài thành phần bên thứ 3. –

1

Nếu bạn không thể lặp lại điều đó cho mình, và chương trình của bạn không cần quản trị để chạy, tôi muốn có một chút đáng ngờ về

  • Sự ổn định của phần cứng của hệ thống mà
  • virus/trạng thái phần mềm độc hại của hệ thống đó.

Nếu bạn có thể truy cập vật lý vào hộp ứng dụng, có thể cần quét toàn bộ vi-rút bằng máy quét cập nhật và chạy đầy đủ memtest trên đó.

Tôi đã có một hệ thống một lần dường như ổn định, ngoại trừ một vài chương trình certian sẽ không chạy trên nó (và đôi khi sẽ sụp đổ hộp). Memtest cho thấy RAM của tôi đã có một số bit xấu, nhưng họ đã ở trong sims higer, vì vậy họ chỉ có được truy cập nếu một chương trình đã cố gắng sử dụng rất nhiều RAM.

+0

Đúng, có thể do lỗi phần cứng. –

1

Không, và đó là khá nhiều theo định nghĩa. Điều tồi tệ nhất mà bạn có thể nói là một ứng dụng đất người dùng có thể đã "kích hoạt" một lỗi Windows hoặc một lỗi trình điều khiển. Nhưng một hệ điều hành máy tính để bàn hiện đại hoàn toàn chịu trách nhiệm về tính toàn vẹn của nó; BSOD là sự thất bại của tính toàn vẹn đó. Do đó hệ điều hành chịu trách nhiệm và chỉ có hệ điều hành.

(Ví dụ về lỗi BSOD mà ứng dụng của bạn có thể hiển thị: máy quét vi rút được cài đặt làm trình điều khiển, gặp sự cố khi thực thi tệp từ sector 0xFFFFFFFF, một ngành trên máy này chỉ xảy ra chứa một tệp DLL của bạn ứng dụng)

+0

Tôi sẽ không nói chỉ hệ điều hành có trách nhiệm. Chắc chắn hệ điều hành sẽ không thể chạy được từ một ứng dụng không có đặc quyền, nhưng chúng ta phải đối phó với các hệ điều hành thực tế. –

+0

Lỗi hệ điều hành là một thực tế không thể chối cãi nhưng quan sát đó không lấy đi bất cứ điều gì từ trách nhiệm. – MSalters

-1

Tôi gặp sự cố khi thoát ứng dụng của mình mà không dừng tất cả các quy trình và kết nối BD khi chương trình kết thúc (tôi đã làm hỏng toàn bộ IDE). Tôi đặt "dừng và ngắt kết nối" mã trong "chấm dứt" của sự kiện "Form_Closed" của hình thức chính của tôi và vấn đề wa giải quyết, tôi không biết nó đây là tình hình của bạn.

Một vấn đề khác có thể là nếu người dùng đang cố gắng truy cập vào cùng tài nguyên mà ứng dụng của bạn đang sử dụng (cơ sở dữ liệu, phần cứng, ổ cắm, v.v ...). Hỏi anh ta/cô ấy về những ứng dụng anh ta/cô ấy đang sử dụng khi BSOD xảy ra.

Không thể loại bỏ vi-rút.

+0

Hài hước như thế nào một câu trả lời có thể thu thập một cuộc bỏ phiếu tiêu cực tám năm sau đó (tôi đã quá trẻ trở lại sau đó!) –

-1

Đây là một C# lệnh chương trình dòng đơn giản mà gây ra một 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

Điều này đã được đề cập đến bởi câu trả lời chấp nhận - tám năm trước đây. – duskwuff

Các vấn đề liên quan