ฉันจะปิดใช้งานไดอะล็อก 'Debug / Close Application' บน Windows Vista ได้อย่างไร?


86

เมื่อแอปพลิเคชันขัดข้องบน Windows และมีการติดตั้งโปรแกรมแก้ไขจุดบกพร่องเช่น Visual Studio กล่องโต้ตอบโมดอลต่อไปนี้จะปรากฏขึ้น

[ชื่อ: Microsoft Windows]

X หยุดทำงานแล้ว

ปัญหาทำให้โปรแกรมหยุดทำงานอย่างถูกต้อง Windows จะปิดโปรแกรมและแจ้งให้คุณทราบหากมีวิธีแก้ปัญหา

[Debug] [ปิดแอปพลิเคชัน]

มีวิธีปิดใช้งานกล่องโต้ตอบนี้หรือไม่? นั่นคือโปรแกรมมีปัญหาและเบิร์นเงียบหรือไม่?

สถานการณ์ของฉันคือฉันต้องการเรียกใช้การทดสอบอัตโนมัติหลายครั้งซึ่งบางส่วนอาจเกิดข้อผิดพลาดเนื่องจากข้อบกพร่องในแอปพลิเคชันที่อยู่ระหว่างการทดสอบ ฉันไม่ต้องการให้กล่องโต้ตอบเหล่านี้ขัดขวางการทำงานอัตโนมัติ

การค้นหารอบ ๆ ฉันคิดว่าฉันได้พบวิธีแก้ปัญหาสำหรับการปิดใช้งานสิ่งนี้บน Windows XP ซึ่งกำลังทำให้คีย์ reg นี้:

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

อย่างไรก็ตามสิ่งนี้ไม่สามารถใช้ได้กับ Windows Vista


การบำรุงรักษาคีย์ AeDebug \ Debugger ไม่มีผลกับฉันใน Windows XP ไม่ว่าจะในแอปคอนโซลที่คอมไพล์ด้วยการดีบักหรือไลบรารีที่ไม่แก้ไข
rptb1

คำตอบ:


56

หากต้องการบังคับให้ Windows Error Reporting (WER) ทำการถ่ายโอนข้อมูลข้อขัดข้องและปิดแอปแทนที่จะแจ้งให้คุณแก้ไขข้อบกพร่องของโปรแกรมคุณสามารถตั้งค่ารายการรีจิสทรีเหล่านี้ได้:

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

หลังจากตั้งค่านี้แล้วเมื่อแอปของคุณขัดข้องคุณจะเห็นไฟล์ * .hdmp และ * .mdmp ใน:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\

3
DefaultConsent = 1 ดูเหมือนจะเป็นค่าเริ่มต้น แล้ว DontShowUI ล่ะ?
Zitrax

เอกสารของ ForceQueue คลุมเครือฉันไม่เข้าใจว่ามันหมายถึงอะไร
Zitrax

2
@NicJ โปรดเพิ่ม DontShowUI = 1 ในคำตอบของคุณมันเป็นสิ่งสำคัญ
Youda008

1
ยังสามารถตั้งค่าภายใต้ HKEY_CURRENT_USER ฉันเชื่อว่า
PJTraill

2
การแก้ไขรีจิสทรีของ windows เป็นหนทางสู่นรกไอทีควรพิจารณาคำตอบจาก armenzg
lowtech

45

ดูที่นี่:

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

regedit

DWORD HKLM หรือ HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ DontShowUI = "1"

จะทำให้ WER รายงานแบบเงียบ ๆ จากนั้นคุณสามารถตั้งค่า

DWORD HKLM หรือ HKCU \ Software \ Microsoft \ Windows \ Windows Error Reporting \ Disabled = "1"

เพื่อหยุดไม่ให้คุยกับ MS


ทำงานให้ฉันในการแก้ไขปัญหา VSTS Build Agent ที่ฉันพยายามเรียกใช้การทดสอบซีลีเนียม ขอบคุณ!
Stu1986C

36

ฉันไม่แน่ใจว่านี่หมายถึงกล่องโต้ตอบเดียวกันหรือเปล่า แต่นี่เป็นอีกทางเลือกหนึ่งของRaymond Chen :

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

ใช่การเรียก SetErrorMode แบบนั้นจะป้องกันไม่ให้กล่องโต้ตอบ WER ที่ OP กล่าวถึง
Roman Starkov

2
ปัญหาที่ฉันมีกับ SetErrorMode และแฟล็ก SEM_NOGPFAULTERRORBOX คือไม่สร้างไฟล์ดัมพ์และสร้างรายการใน Windows Event Log โปรแกรมของคุณจะหายไปอย่างไร้ร่องรอยเมื่อเกิดปัญหา ด้วยเหตุนี้ฉันคิดว่าโซลูชันรีจิสทรีดีกว่า
Derek

สิ่งนี้ใช้ได้กับเฟรมเวิร์กที่ล้าสมัย (ตั้งแต่ WinXP)
Wolf

1
ตกลงว่าไม่ดีที่จะจัดส่งด้วย อย่างไรก็ตามมันมีประโยชน์มากในการปลดบล็อกงานอัตโนมัติที่ไม่เสถียร
kayleeFrye_onDeck

31

ฉันต้องปิดการใช้งานสิ่งนี้เพื่อให้การทำงานอัตโนมัติใน Windows 64 บิตสำหรับ Firefox และฉันทำสิ่งต่อไปนี้:

  • gpedit.msc
  • การกำหนดค่าคอมพิวเตอร์ -> เทมเพลตการดูแลระบบ
  • ส่วนประกอบของ Windows -> การรายงานข้อผิดพลาดของ Windows
  • ตั้งค่า "ป้องกันการแสดงอินเทอร์เฟซผู้ใช้สำหรับข้อผิดพลาดร้ายแรง" เป็นเปิดใช้งาน

คล้ายกับสิ่งที่ทำได้สำหรับการรายงานประสบการณ์ของลูกค้าใน: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm


13

ในบริบทของฉันฉันต้องการระงับป๊อปอัปสำหรับการทดสอบหน่วยของฉันเท่านั้นไม่ใช่สำหรับทั้งระบบ ฉันพบว่าจำเป็นต้องใช้ฟังก์ชันร่วมกันเพื่อระงับข้อผิดพลาดเหล่านี้เช่นการตรวจจับข้อยกเว้นที่ไม่สามารถจัดการได้การระงับการตรวจสอบเวลาทำงาน (เช่นความถูกต้องของตัวชี้สแต็ก) และแฟล็กโหมดข้อผิดพลาด นี่คือสิ่งที่ฉันใช้กับความสำเร็จ:

#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

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

ดูเหมือนจะไม่มีอะไรเฉพาะ WPF ในนั้นและดูเหมือนว่าจะใช้งานได้ดีในแอปพลิเคชันคอนโซลของฉันด้วย (.NET 4.6.2 ใน Windows 10)
mookid8000

4

คุณต้องใช้ตัวกรองยกเว้น unhandled ซึ่งก็สละใบสมัครของคุณแล้วตั้งฟังก์ชั่นตัวกรองที่มีSetUnhandledExceptionFilter ()

หากคุณใช้ CRT ที่ปลอดภัยคุณจะต้องระบุตัวจัดการพารามิเตอร์ที่ไม่ถูกต้องของคุณเองและตั้งค่านี้ด้วย_set_invalid_parameter_handler ()

บล็อกโพสต์นี้มีข้อมูลบางส่วนด้วย: http://blog.kalmbachnet.de/?postid=75


4

ในระหว่างการทดสอบคุณสามารถรันด้วย'ดีบักเกอร์' เช่น ADPlus ที่แนบมาซึ่งสามารถกำหนดค่าได้หลายวิธีที่มีประโยชน์ในการรวบรวมข้อมูล (minidumps) เมื่อเกิดข้อผิดพลาดและยังป้องกันปัญหาการโต้ตอบโมดอลที่คุณระบุไว้ข้างต้น

หากคุณต้องการรับข้อมูลที่เป็นประโยชน์เมื่อแอปของคุณขัดข้องในการใช้งานจริงคุณสามารถกำหนดค่าการรายงานข้อผิดพลาดของ Microsoftเพื่อรับข้อมูลที่คล้ายกับข้อมูล ADPlus


4

นี่ไม่ใช่คำตอบโดยตรงสำหรับคำถามเนื่องจากนี่เป็นวิธีแก้ปัญหาชั่วคราวและคำถามเกี่ยวกับวิธีปิดใช้งานคุณลักษณะนั้น แต่ในกรณีของฉันฉันเป็นผู้ใช้บนเซิร์ฟเวอร์ที่มีสิทธิ์ จำกัด และไม่สามารถปิดใช้งานคุณลักษณะนี้โดยใช้หนึ่งใน คำตอบอื่น ๆ ดังนั้นฉันต้องการวิธีแก้ปัญหาชั่วคราว สิ่งนี้น่าจะใช้ได้กับคนอื่น ๆ อย่างน้อยบางคนที่ตอบคำถามนี้

ฉันใช้autohotkey แบบพกพาและสร้างมาโครที่ตรวจสอบนาทีละครั้งเพื่อดูว่ามีกล่องป๊อปอัปอยู่หรือไม่และหากเป็นเช่นนั้นให้คลิกปุ่มเพื่อปิดโปรแกรม ในกรณีของฉันนั่นเพียงพอแล้วและปล่อยฟีเจอร์นี้ไว้ให้ผู้ใช้รายอื่น ต้องการให้ฉันเริ่มสคริปต์เมื่อฉันเรียกใช้โปรแกรมที่มีความเสี่ยง แต่มันใช้ได้กับความต้องการของฉัน

สคริปต์มีดังนี้:

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
}

แก้ไข:ธงด่วน เมื่อสิ่งอื่น ๆ ขึ้นดูเหมือนว่าจะพยายามเปิดใช้งานการควบคุมในหน้าต่างเบื้องหน้าซึ่งควรจะส่งไปยังโปรแกรมในพื้นหลัง หากฉันพบวิธีแก้ไขฉันจะแก้ไขคำตอบนี้เพื่อสะท้อนให้เห็น แต่สำหรับตอนนี้โปรดใช้ความระมัดระวังเกี่ยวกับการใช้สิ่งนี้และพยายามทำงานอื่น ๆ บนเครื่องไปพร้อมกัน


3

หลังจากลองทำอย่างอื่นบนอินเทอร์เน็ตเพื่อกำจัดโปรแกรมดีบั๊กในเวลาที่เหมาะสมฉันพบวิธีง่ายๆที่ใช้งานได้จริงและฉันหวังว่าจะช่วยคนอื่นได้

ไปที่แผงควบคุมไปที่เครื่องมือการดูแลระบบไปที่บริการค้นหารายการสำหรับ Machine Debug Manager คลิกขวาที่มันแล้วคลิกที่ Properties ภายใต้แท็บทั่วไปมองหา Start Up Type คลิกที่ Disable คลิกที่ใช้และตกลง

ฉันไม่เห็นข้อความดีบักเกอร์เลยและคอมพิวเตอร์ของฉันทำงานได้อย่างสมบูรณ์แบบ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.