Windows Vista'da 'Uygulamayı Hata Ayıkla / Kapat' iletişim kutusunu nasıl devre dışı bırakırım?


86

Windows'ta bir uygulama çöktüğünde ve Visual Studio gibi bir hata ayıklayıcı yüklendiğinde aşağıdaki kalıcı iletişim kutusu görüntülenir:

[Başlık: Microsoft Windows]

X çalışmayı durdurdu

Programın doğru çalışmasına engel olan bir problem oluştu. Windows programı kapatacak ve bir çözüm olup olmadığını size bildirecektir.

[Hata Ayıkla] [Uygulamayı Kapat]

Bu iletişim kutusunu devre dışı bırakmanın bir yolu var mı? Yani, programın çökmesi ve sessizce yanması mı?

Benim senaryom, test edilen uygulamadaki hatalar nedeniyle bazıları çökecek olan birkaç otomatik test çalıştırmak istiyorum. Bu diyalogların otomasyonun çalışmasını geciktirmesini istemiyorum.

Etrafta arama yaptım, sanırım bunu Windows XP'de devre dışı bırakmanın çözümünü buldum, bu da bu reg anahtarını nuking yapıyor:

HKLM \ Yazılım \ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Hata Ayıklayıcı

Ancak bu, Windows Vista'da işe yaramadı.


AeDebug \ Debugger anahtarını nuking yapmak, Windows XP altında, hata ayıklama veya hata ayıklama olmayan kitaplıklarla derlenen konsol uygulamalarında benim için hiçbir etkiye sahip değildi.
rptb1

Yanıtlar:


56

Windows Hata Bildirimi'ni (WER) bir kilitlenme dökümü almaya ve uygulamayı kapatmaya zorlamak için sizden programda hata ayıklamanızı istemek yerine şu kayıt defteri girdilerini ayarlayabilirsiniz:

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

Bu ayarlandıktan sonra, uygulamalarınız kilitlendiğinde, * .hdmp ve * .mdmp dosyalarını şurada görmelisiniz:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

3
DefaultConsent = 1 varsayılan olarak görünüyor. DontShowUI ne olacak?
Zitrax

ForceQueue'nun dokümantasyonu belirsiz, tam olarak ne anlama geldiğini anlamıyorum.
Zitrax

2
@NicJ lütfen cevabınıza DontShowUI = 1 ekleyin, bu önemli olan
Youda008

1
HKEY_CURRENT_USER altında da ayarlanabilir, inanıyorum ki
PJTraill

2
Windows kayıt defteri düzenleme BT cehennemine giden yoldur, armenzg'den gelen yanıtı daha iyi düşünün
lowtech

45

Buraya bakın:

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

Regedit

DWORD HKLM veya HKCU \ Software \ Microsoft \ Windows \ Windows Hata Bildirimi \ DontShowUI = "1"

WER'i sessizce rapor edecek. O zaman ayarlayabilirsin

DWORD HKLM veya HKCU \ Software \ Microsoft \ Windows \ Windows Hata Bildirimi \ Disabled = "1"

MS ile konuşmasını engellemek için.


Selenium testlerini çalıştırmaya çalıştığım bir VSTS Derleme Aracısı sorununu düzeltmek için benim için çalıştı. Teşekkürler!
Stu1986C

36

Bunun tamamen aynı diyaloğa atıfta bulunup bulunmadığından emin değilim ama işte Raymond Chen'den alternatif bir yaklaşım :

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

Evet, SetErrorMode'un çağrılması, OP tarafından bahsedilen WER iletişim kutusunu engeller.
Roman Starkov

2
SetErrorMode ve SEM_NOGPFAULTERRORBOX bayrağıyla ilgili sorunum, bir döküm dosyası oluşturmaması ve Windows Olay Günlüğünde bir giriş yapmamasıdır. Programınız çöktüğünde iz bırakmadan kaybolacaktır. Bu nedenle kayıt defteri çözümünün daha iyi olduğunu düşünüyorum.
Derek

Bu aynı zamanda eski çerçeveler için de işe yarar (WinXP'den beri).
Wolf

1
Bunun gönderilmesinin iyi olmadığı konusunda hemfikir. Bununla birlikte, otomasyon görevlerinin kararsız olan engelini kaldırmak gerçekten yararlıdır.
kayleeFrye_onDeck

31

Firefox için Windows 64 bitlik sürüm otomasyonu çalışması için bunu devre dışı bırakmak zorunda kaldım ve aşağıdakileri yaptım:

  • gpedit.msc
  • Bilgisayar yapılandırması -> Yönetim Şablonları
  • Windows Bileşenleri -> Windows Hata Bildirimi
  • "Kritik hatalar için kullanıcı arayüzünün görüntülenmesini önle" seçeneğini Etkin olarak ayarlayın

Müşteri Deneyimi raporlaması için şu adreste elde edilene benzer: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

Benim bağlamımda, tüm sistem için değil, yalnızca birim testlerim için açılır pencereyi gizlemek istiyorum. Bu hataları bastırmak için, işlenmemiş istisnaları yakalamak, çalışma zamanı kontrollerini (yığın işaretçisinin geçerliliği gibi) ve hata modu bayraklarını bastırmak gibi bir işlev kombinasyonunun gerekli olduğunu buldum. Başarılı bir şekilde kullandım:

#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

WPF uygulamasında

[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 );
}

Orada gibi görünmüyor orada bir şey WPF özgü, ve o (Windows .NET 4.6.2 10) benim de Konsol Uygulamasında gayet işe görünüyor
mookid8000


4

Test sırasında, ADPlus gibi bir 'hata ayıklayıcı' eklenmiş olarak çalıştırabilirsiniz; bu, hatalar hakkında veri toplamak (mini dökümler) için birçok faydalı şekilde yapılandırılabilir ve yine de yukarıda belirttiğiniz kalıcı iletişim sorunlarını önler.

Uygulamanız üretim sırasında çöktüğünde bazı yararlı bilgiler almak istiyorsanız, ADPlus verilerine benzer bir şey almak için Microsoft Hata raporlamasını yapılandırabilirsiniz .


4

Bu bir geçici çözüm olduğundan ve soru bu özelliğin nasıl devre dışı bırakılacağıyla ilgili olduğundan, bu soruya doğrudan bir cevap değildir, ancak benim durumumda sınırlı izinlere sahip bir sunucuda kullanıcıyım ve şu özelliklerden birini kullanarak özelliği devre dışı bırakamıyorum diğer cevaplar. Bu yüzden bir geçici çözüme ihtiyacım vardı. Bu muhtemelen en azından bu soruyla sonuçlanan diğerleri için işe yarayacaktır.

Autohotkey portable'ı kullandım ve dakikada bir açılır kutunun olup olmadığını kontrol eden ve varsa, programı kapatmak için düğmeyi tıklatan bir makro oluşturdum. Benim durumumda, bu yeterli ve özelliği diğer kullanıcılar için açık bırakıyor. Riskli programı çalıştırdığımda komut dosyasını başlatmam gerekiyor, ancak ihtiyaçlarım için çalışıyor.

Komut dosyası aşağıdaki gibidir:

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
}

düzenleme: Hızlı bir bayrak. Başka şeyler ortaya çıktığında, bu ön plan penceresindeki kontrolleri etkinleştirmeye çalışıyor gibi görünüyor - arka planda programa göndermesi gerekiyor. Bir düzeltme bulursam, bu yanıtı yansıtacak şekilde düzenlerim, ancak şimdilik, bunu kullanırken ve aynı anda bir makinede başka işler yapmaya çalışırken dikkatli olun.


3

Tam zamanında hata ayıklayıcıdan kurtulmak için internetteki her şeyi denedikten sonra, gerçekten işe yarayan basit bir yol buldum ve umarım başka birine yardımcı olur.

Denetim Masası'na gidin Yönetimsel Araçlara Git Hizmetlere Git Makine Hata Ayıklama Yöneticisi için listeye bakın Sağ tıklayın ve Özellikler'e tıklayın Genel Sekmesi altında, Başlangıç ​​Türü'nü arayın Devre Dışı Bırak'a tıklayın. Uygula ve Tamam'a tıklayın.

O zamandan beri hata ayıklayıcı mesajını görmedim ve bilgisayarım mükemmel çalışıyor.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.