Làm cách nào để tắt hộp thoại 'Gỡ lỗi / Đóng ứng dụng' trên Windows Vista?


86

Khi ứng dụng gặp sự cố trên Windows và trình gỡ lỗi như Visual Studio được cài đặt, hộp thoại phương thức sau sẽ xuất hiện:

[Tiêu đề: Microsoft Windows]

X đã ngừng hoạt động

Đã xảy ra sự cố khiến chương trình ngừng hoạt động bình thường. Windows sẽ đóng chương trình và thông báo cho bạn nếu có giải pháp.

[Gỡ lỗi] [Đóng ứng dụng]

Có cách nào để tắt hộp thoại này không? Đó là, có chương trình chỉ bị sập và cháy âm thầm?

Kịch bản của tôi là tôi muốn chạy một số thử nghiệm tự động, một số thử nghiệm trong số đó sẽ bị lỗi do các lỗi trong ứng dụng đang thử nghiệm. Tôi không muốn những hộp thoại này làm ngưng trệ quá trình chạy tự động hóa.

Tìm kiếm xung quanh, tôi nghĩ rằng tôi đã tìm ra giải pháp để tắt tính năng này trên Windows XP, đó là ký hiệu khóa reg này:

HKLM \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger

Tuy nhiên, điều đó không hoạt động trên Windows Vista.


Việc gõ phím AeDebug \ Debugger không có tác dụng đối với tôi trong Windows XP, cả trên các ứng dụng console được biên dịch với các thư viện gỡ lỗi hoặc không gỡ lỗi.
rptb1

Câu trả lời:


56

Để buộc Báo cáo Lỗi Windows (WER) thực hiện kết xuất sự cố và đóng ứng dụng, thay vì nhắc bạn gỡ lỗi chương trình, bạn có thể đặt các mục đăng ký sau:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"ForceQueue"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent]
"DefaultConsent"=dword:00000001

Sau khi thiết lập này, khi ứng dụng của bạn gặp sự cố, bạn sẽ thấy các tệp * .hdmp và * .mdmp trong:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

3
DefaultConsent = 1 dường như là mặc định. Còn về DontShowUI?
Zitrax

Tài liệu về ForceQueue rất mơ hồ, tôi không hiểu chính xác ý nghĩa của nó.
Zitrax

2
@NicJ xin vui lòng thêm DontShowUI = 1 đến câu trả lời của bạn, nó là một trong những điều cần thiết
Youda008

1
Cũng có thể được đặt dưới HKEY_CURRENT_USER, tôi tin rằng
PJTraill

2
chỉnh sửa sổ đăng ký cửa sổ là con đường dẫn đến địa ngục CNTT, tốt hơn hãy xem xét câu trả lời từ armenzg
lowtech

45

Xem tại đây:

http://msdn.microsoft.com/en-us/library/bb513638.aspx

regedit

DWORD HKLM hoặc HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = "1"

sẽ làm cho WER âm thầm báo cáo. Sau đó, bạn có thể đặt

DWORD HKLM hoặc HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

để ngăn nó nói chuyện với MS.


Đã giúp tôi khắc phục sự cố VSTS Build Agent nơi tôi đang cố gắng chạy thử nghiệm Selenium. Cảm ơn!
Stu1986C

36

Tôi không chắc điều này có đề cập đến chính xác cùng một hộp thoại hay không nhưng đây là một cách tiếp cận thay thế từ Raymond Chen :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);

Có, việc gọi SetErrorMode như vậy sẽ ngăn hộp thoại WER được OP đề cập.
Roman Starkov

2
Vấn đề tôi gặp phải với SetErrorMode và cờ SEM_NOGPFAULTERRORBOX là nó không tạo tệp kết xuất và tạo mục nhập trong Nhật ký sự kiện Windows. Chương trình của bạn sẽ biến mất mà không có dấu vết khi nó gặp sự cố. Vì lý do này, tôi nghĩ rằng giải pháp đăng ký là tốt hơn.
Derek

Điều này cũng hoạt động cho các khung đã lỗi thời (kể từ WinXP).
Wolf

1
Đồng ý rằng điều này không tốt để vận chuyển. Tuy nhiên, nó thực sự hữu ích để bỏ chặn các tác vụ tự động hóa không ổn định.
kayleeFrye_onDeck

31

Tôi đã phải tắt tính năng này để tự động hóa công việc phát hành trên Windows 64-bit cho Firefox và tôi đã làm như sau:

  • gpedit.msc
  • Cấu hình máy tính -> Mẫu quản trị
  • Cấu phần Windows -> Báo cáo lỗi Windows
  • Đặt "Ngăn chặn hiển thị giao diện người dùng đối với các lỗi nghiêm trọng" thành Đã bật

Nó tương tự như những gì đã được thực hiện cho báo cáo Trải nghiệm khách hàng trong: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

Trong bối cảnh của tôi, tôi chỉ muốn chặn cửa sổ bật lên cho các bài kiểm tra đơn vị của tôi chứ không phải cho toàn bộ hệ thống. Tôi nhận thấy rằng cần có sự kết hợp của các hàm để loại bỏ những lỗi này, chẳng hạn như bắt các ngoại lệ không được xử lý, ngăn kiểm tra thời gian chạy (chẳng hạn như tính hợp lệ của con trỏ ngăn xếp) và cờ chế độ lỗi. Đây là những gì tôi đã sử dụng với một số thành công:

#include <windows.h>
#include <rtcapi.h>
int exception_handler(LPEXCEPTION_POINTERS p)
{
    printf("Exception detected during the unit tests!\n");
    exit(1);
}
int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...)
{
    printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName);
    exit(1);
}

int main()
{
    DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
    SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler); 
    _RTC_SetErrorFunc(&runtime_check_handler);

    // Run your tests here

    return 0;
}

8

Trong ứng dụng WPF

[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);

[DllImport("kernel32.dll")]
static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
public delegate bool FilterDelegate(Exception ex);

public static void DisableChashReport()
{
 FilterDelegate fd = delegate(Exception ex)
 {
  return true;
 };
 SetUnhandledExceptionFilter(fd);
 SetErrorMode(SetErrorMode(0) | 0x0002 );
}

Không giống như có điều gì WPF cụ thể trong đó, và nó dường như chỉ làm việc tốt trong ứng dụng điều khiển của tôi, quá (NET 4.6.2 trong Windows 10)
mookid8000

4

Bạn phải triển khai một bộ lọc ngoại lệ chưa xử lý đơn giản là thoát ứng dụng của bạn, sau đó đặt chức năng bộ lọc đó bằng SetUnhandledExceptionFilter () .

Nếu bạn đang sử dụng CRT bảo mật, bạn cũng phải cung cấp trình xử lý tham số không hợp lệ của riêng mình và đặt điều này bằng _set_invalid_parameter_handler ().

Bài đăng trên blog này cũng có một số thông tin: http://blog.kalmbachnet.de/?postid=75


4

Trong quá trình kiểm tra, bạn có thể chạy với một 'trình gỡ lỗi' như ADPlus đính kèm có thể được định cấu hình theo nhiều cách hữu ích để thu thập dữ liệu (các lỗi nhỏ) về lỗi và vẫn ngăn chặn các sự cố hộp thoại phương thức mà bạn nêu ở trên.

Nếu bạn muốn nhận được một số thông tin hữu ích khi ứng dụng của bạn gặp sự cố trong quá trình sản xuất, bạn có thể định cấu hình báo cáo Lỗi Microsoft để nhận thông tin tương tự như dữ liệu ADPlus.


4

Đây không phải là câu trả lời trực tiếp cho câu hỏi vì đây là một cách giải quyết và câu hỏi là về cách tắt tính năng đó, nhưng trong trường hợp của tôi, tôi là người dùng trên máy chủ có quyền hạn chế và không thể tắt tính năng này bằng cách sử dụng một trong các các câu trả lời khác. Vì vậy, tôi cần một giải pháp thay thế. Điều này có thể sẽ hiệu quả với ít nhất một số người khác kết thúc với câu hỏi này.

Tôi đã sử dụng autohotkey portable và tạo macro kiểm tra mỗi phút một lần để xem hộp bật lên có tồn tại hay không và nếu có, hãy nhấp vào nút để đóng chương trình. Trong trường hợp của tôi, đó là đủ và để lại tính năng cho những người dùng khác. Nó yêu cầu tôi bắt đầu tập lệnh khi tôi chạy chương trình có rủi ro, nhưng nó hoạt động theo nhu cầu của tôi.

Kịch bản như sau:

sleep_duration = 60000 ; how often to check, in milliseconds.
                       ; 60000 is a full minute

Loop
{
    IfWinExist, ahk_class #32770 ; use autohotkey's window spy to confirm that
                ; ahk_class #32770 is it for you. This seemed to be consistent
                ; across all errors like this on Windows Server 2008
    {
        ControlClick, Button2, ahk_class #32770 ; sends the click.
                ; Button2 is the control name and then the following
                ; is that window name again
    }
    Sleep, sleep_duration ; wait for the time set above
}

sửa: Cờ nhanh. Khi những thứ khác hoạt động, điều này dường như cố gắng kích hoạt các điều khiển trong cửa sổ nền trước - nó phải gửi nó đến chương trình ở chế độ nền. Nếu tôi tìm thấy bản sửa lỗi, tôi sẽ chỉnh sửa câu trả lời này để phản ánh nó, nhưng hiện tại, hãy thận trọng khi sử dụng câu trả lời này và cố gắng thực hiện công việc khác trên máy cùng một lúc.


3

Sau khi thử mọi thứ khác trên internet để loại bỏ trình gỡ lỗi đúng lúc, tôi đã tìm thấy một cách đơn giản thực sự hiệu quả và tôi hy vọng sẽ giúp được ai đó.

Đi tới Bảng điều khiển Đi tới Công cụ quản trị Đi tới Dịch vụ Nhìn xuống danh sách cho Trình quản lý gỡ lỗi máy Nhấp chuột phải vào nó và nhấp vào Thuộc tính Dưới tab Chung, tìm Loại Khởi động Nhấp vào Tắt. Nhấp vào Áp dụng và OK.

Tôi đã không thấy thông báo trình gỡ lỗi kể từ đó và máy tính của tôi đang chạy hoàn hảo.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.