Bagaimana cara menonaktifkan dialog 'Debug / Tutup Aplikasi' di Windows Vista?

86

Ketika aplikasi lumpuh di Windows dan debugger seperti Visual Studio diinstal, dialog modal berikut muncul:

[Judul: Microsoft Windows]

X berhenti bekerja

Masalah menyebabkan program berhenti bekerja dengan semestinya. Windows akan menutup program dan memberi tahu Anda jika solusi tersedia.

[Debug] [Tutup Aplikasi]

Apakah ada cara untuk menonaktifkan dialog ini? Artinya, apakah program hanya crash dan burn secara diam-diam?

Skenario saya adalah saya ingin menjalankan beberapa tes otomatis, beberapa di antaranya akan macet karena bug dalam aplikasi yang sedang diuji. Saya tidak ingin dialog ini menghentikan proses otomatisasi.

Mencari-cari di sekitar saya pikir saya telah menemukan solusi untuk menonaktifkan ini di Windows XP, yang menukarkan kunci reg ini:

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

Namun, itu tidak berhasil pada Windows Vista.

Chris Smith
sumber
Nuking kunci AeDebug \ Debugger tidak berpengaruh bagi saya di bawah Windows XP, baik pada aplikasi konsol yang dikompilasi dengan pustaka debugging atau non-debugging.
rptb1

Jawaban:

56

Untuk memaksa Windows Error Reporting (WER) mengambil crash dump dan menutup aplikasi, alih-alih meminta Anda untuk men-debug program, Anda dapat menyetel entri registri ini:

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

Setelah ini disetel, saat aplikasi Anda mogok, Anda akan melihat file * .hdmp dan * .mdmp di:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
NicJ
sumber
3
DefaultConsent = 1 tampaknya menjadi default. Bagaimana dengan DontShowUI?
Zitrax
Dokumentasi ForceQueue tidak jelas, saya tidak mengerti persis apa artinya.
Zitrax
2
@NicJ tolong tambahkan DontShowUI = 1 ke jawaban Anda, ini yang paling penting
Youda008
1
Dapat juga disetel di bawah HKEY_CURRENT_USER, saya yakin
PJTraill
2
pengeditan registri windows adalah cara untuk IT neraka, lebih baik pertimbangkan jawaban dari armenzg
lowtech
45

Lihat disini:

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

regedit

DWORD HKLM atau HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = "1"

akan membuat WER melaporkan secara diam-diam. Kemudian Anda dapat mengatur

DWORD HKLM atau HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

untuk menghentikannya berbicara dengan MS.


sumber
Bekerja untuk saya dalam memperbaiki masalah VSTS Build Agent di mana saya mencoba menjalankan tes Selenium. Terima kasih!
Stu1986C
36

Saya tidak yakin apakah ini merujuk pada dialog yang persis sama tetapi berikut adalah pendekatan alternatif dari Raymond Chen :

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
Luke Quinane
sumber
Ya, memanggil SetErrorMode seperti itu mencegah dialog WER yang disebutkan oleh OP.
Roman Starkov
2
Masalah yang saya alami dengan SetErrorMode dan bendera SEM_NOGPFAULTERRORBOX adalah bahwa ia tidak membuat file dump dan membuat entri di Windows Event Log. Program Anda akan hilang begitu saja tanpa jejak saat macet. Untuk alasan ini saya pikir solusi registri lebih baik.
Derek
Ini juga berfungsi untuk kerangka kerja yang sudah ketinggalan zaman (sejak WinXP).
Serigala
1
Setuju bahwa ini tidak baik untuk dikirim. Namun, sangat berguna untuk membuka blokir yang tidak stabil ke tugas-tugas otomatisasi.
kayleeFrye_onDeck
31

Saya harus menonaktifkan ini untuk otomatisasi rilis bekerja pada Windows 64-bit untuk Firefox dan saya melakukan hal berikut:

  • gpedit.msc
  • Konfigurasi komputer -> Template Administratif
  • Komponen Windows -> Pelaporan Kesalahan Windows
  • Setel "Cegah tampilan antarmuka pengguna untuk kesalahan kritis" ke Diaktifkan

Hal serupa dicapai untuk pelaporan Pengalaman Pelanggan di: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

armenzg.dll
sumber
13

Dalam konteks saya, saya hanya ingin menyembunyikan munculan untuk pengujian unit saya dan bukan untuk seluruh sistem. Saya telah menemukan bahwa kombinasi fungsi diperlukan untuk menekan kesalahan ini, seperti menangkap pengecualian yang tidak tertangani, menekan pemeriksaan waktu proses (seperti validitas penunjuk tumpukan) dan bendera mode kesalahan. Inilah yang saya gunakan dengan beberapa keberhasilan:

#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;
}
Gearoid Murphy
sumber
8

Dalam aplikasi 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 );
}
Francesco Germinara
sumber
Tidak terlihat seperti ada sesuatu yang spesifik untuk WPF di sana, dan tampaknya berfungsi dengan baik di Aplikasi Konsol saya juga (.NET 4.6.2 di Windows 10)
mookid8000
4

Selama pengujian, Anda dapat menjalankan 'debugger' seperti ADPlus yang terpasang yang dapat dikonfigurasi dengan berbagai cara berguna untuk mengumpulkan data (minidump) pada kesalahan, namun mencegah masalah dialog modal yang Anda sebutkan di atas.

Jika Anda ingin mendapatkan beberapa informasi berguna saat aplikasi Anda mogok dalam produksi, Anda dapat mengonfigurasi pelaporan Kesalahan Microsoft untuk mendapatkan sesuatu yang mirip dengan data ADPlus.

Steve Steiner
sumber
4

Ini bukan jawaban langsung untuk pertanyaan karena ini adalah solusi dan pertanyaannya adalah tentang cara menonaktifkan fitur itu, tetapi dalam kasus saya, saya adalah pengguna di server dengan izin terbatas dan tidak dapat menonaktifkan fitur menggunakan salah satu dari jawaban lainnya. Jadi, saya membutuhkan solusi. Ini kemungkinan besar akan berhasil setidaknya untuk beberapa orang lain yang berakhir dengan pertanyaan ini.

Saya menggunakan autohotkey portabel dan membuat makro yang memeriksa sekali dalam satu menit untuk melihat apakah kotak popup ada, dan jika ya, klik tombol untuk menutup program. Dalam kasus saya, itu sudah cukup, dan membiarkan fitur tersebut aktif untuk pengguna lain. Ini mengharuskan saya memulai skrip saat menjalankan program berisiko, tetapi berfungsi untuk kebutuhan saya.

Scriptnya adalah sebagai berikut:

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
}

edit: Bendera cepat. Ketika ada hal-hal lain, ini sepertinya mencoba untuk mengaktifkan kontrol di jendela latar depan - ini seharusnya mengirimkannya ke program di latar belakang. Jika saya menemukan perbaikan, saya akan mengedit jawaban ini untuk merefleksikannya, tetapi untuk saat ini, berhati-hatilah saat menggunakan ini dan mencoba melakukan pekerjaan lain pada mesin pada saat yang sama.

Nick
sumber
3

Setelah mencoba segala sesuatu di internet untuk menyingkirkan debugger hanya dalam waktu, saya menemukan cara sederhana yang benar-benar berfungsi dan saya harap akan membantu orang lain.

Pergi ke Control Panel Pergi ke Administrative Tools Pergi ke Services Lihat ke bawah daftar Machine Debug Manager Klik kanan padanya dan klik Properties Di bawah Tab Umum, cari Start Up Type Klik Disable. Klik Apply dan OK.

Saya belum melihat pesan debugger sejak itu, dan komputer saya berjalan dengan sempurna.

Vicki Mollenauer
sumber