To może nie być pytanie związane wyłącznie z programowaniem, ale często spotykam się z tym podczas programowania. Gdy moja aplikacja ulega awarii i wybieram jej usunięcie, system Windows automatycznie wyświetla okno dialogowe "Sprawdzanie, czy roztwór ...". Kiedy kliknę przycisk "Anuluj", otrzymuję kolejne okno dialogowe z napisem "Restartowanie programu ..." Czy istnieje sposób, aby temu zapobiec? Gdy zatrzymam aplikację, wolałbym, aby została ona cicho zabita. Używam Windows 7, jeśli platforma jest ważna.Windows - Zapobieganie awariom "Sprawdzanie rozwiązania ..." i "Ponowne uruchamianie programu ..."
Windows - Zapobieganie awariom "Sprawdzanie rozwiązania ..." i "Ponowne uruchamianie programu ..."
Odpowiedz
Aby kontrolować to zachowanie, wykonaj czynności opisane w sekcji this article.
Spójrz na Windows Error Reporting APIs.
Sprawdź odpowiedzi na te pytania:
Chociaż Microsoft zaleca użycie nowszej API zastępczy dostępne tylko w systemie Windows Vista i nowszych istnieje API, które działa dla wszystkich wersji systemu Windows od XP: AddERExcludedApplication(). Ta funkcja pobiera nazwę modułu bez informacji o ścieżce (np. "Myprogram.exe"), dla której zgłaszanie błędów ma zostać wyłączone.
Nowa dostępna tylko metoda Windows Vista i nowsze wersje to wywołanie WerAddExcludedApplication() function. Ten interfejs API pozwala określić, czy powinien on zmienić gałąź rejestru HKEY_CURRENT_USER, czy gałąź rejestru HKEY_LOCAL_MACHINE. Pamiętaj, aby ustawić to dla HKCU jeśli zestaw HKLM zawiedzie, takich jak:
typedef BOOL (*ADD_MER_EXCLUDED_APP_XP) (PCWSTR); typedef BOOL (*ADD_MER_EXCLUDED_APP_VISTA) (PCWSTR, BOOL); bool disable_microsoft_error_reporting(PCWSTR wz_app) { const WCHAR * const WZ_MER_DLL_XP = L"faultrep.dll"; const char * const SZ_MER_PROC_XP = "AddERExcludedApplicationW"; const WCHAR * const WZ_MER_DLL_VISTA = L"wer.dll"; const char * const SZ_MER_PROC_VISTA = "WerAddExcludedApplicationW"; const int WER_EXCLUDE_FOR_ALL_USERS = TRUE; const int WER_EXCLUDE_FOR_THIS_USER = FALSE; HANDLE hlib_error_reports_xp = NULL; HANDLE hlib_error_reports_vista = NULL; ADD_MER_EXCLUDED_APP_XP add_mer_excluded_app_xp = NULL; ADD_MER_EXCLUDED_APP_VISTA add_mer_excluded_app_vista = NULL; bool success = false; // First, attempt the API that has been around since XP. hlib_error_reports_xp = LoadLibrary(WZ_MER_DLL_XP); if (hlib_error_reports_xp) { add_mer_excluded_app_xp = (ADD_MER_EXCLUDED_APP_XP)GetProcAddress(hlib_error_reports_xp, SZ_MER_PROC_XP); if (add_mer_excluded_app_xp) success = add_mer_excluded_app_xp(wz_app); FreeLibrary(hlib_error_reports_xp); hlib_error_reports_xp = NULL; add_mer_excluded_app_xp = NULL; if (success) return true; } // That did not succeed. Attempt the Vista API. hlib_error_reports_vista = LoadLibrary(WZ_MER_DLL_VISTA); if (hlib_error_reports_vista) { add_mer_excluded_app_vista = (ADD_MER_EXCLUDED_APP_VISTA)GetProcAddress(hlib_error_reports_vista, SZ_MER_PROC_VISTA); if (add_mer_excluded_app_vista) { success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_ALL_USERS)); if (!success) success = (S_OK == add_mer_excluded_app_vista(wz_app, WER_EXCLUDE_FOR_THIS_USER)); } FreeLibrary(hlib_error_reports_vista); hlib_error_reports_vista = NULL; add_mer_excluded_app_vista = NULL; if (success) return true; } // Nothing worked. Fail. return false; }
Aby dodatkowo ograniczyć wykonywanie elementów WER, imeplement nieobsługiwany wyjątek filtr i przekazać go do: SetUnhandledExceptionFilter() function. Aby zablokować WER, filtr nie może nigdy wrócić EXCEPTION_CONTINUE_SEARCH
ani EXCEPTION_EXECUTE_HANDLER
.
Jedną z wad implementacji funkcji SetUnhandledExceptionFilter()
jest zakłócenie debugowania Just-in-time.
Wspominasz, że chcesz, aby aplikacja była "cicho zabita". W takim przypadku:
LONG WINAPI global_exception_filter(struct _EXCEPTION_POINTERS *exception_info) { ExitProcess(0xDEDD000D); } int WINAPI WinMain( HINSTANCE _hinstance, HINSTANCE hinstance_prev, LPSTR sz_cmd_line, int cmd_show ) { SetUnhandledExceptionFilter(global_exception_filter); /* ... */ }
Powoduje natychmiastowe zniknięcie aplikacji po nieobsługiwanym wyjątku. N.B. kod powrotu do zwrotu jest kwestią gustu.
OGROMNE OGRANICZENIE: Nikt nie powinien KIEDYKOLWIEK używać SetUnhandledExceptionFilter w kodzie produkcyjnym. Jeśli używasz SetUnhandledExceptionFilter, upewnij się, że zadzwonisz TerminateProcess w filtrze wyjątku - w przeciwnym razie masz zamiar skręcić łatwo debuggable awarii w jednej z dwóch rzeczy: Jeśli masz szczęście, można uzyskać subtelny uszkodzenia pamięci, który będzie nie sprawia kłopotów Twoim klientom. Jeśli nie masz szczęścia, wprowadzisz w aplikacji przydatny błąd bezpieczeństwa. –
W rzeczywistości moja myśl została zainstalowana filtr, który wywołuje FatalAppExit(). BTW, hi Larry! –
@Larry, dla WerAddExcludedApplication(), czy wiesz, że wymaga to nazwy modułu, a nie pełnej ścieżki lub odwrotnie? –
Zdaję sobie sprawę, że inni odpowiedział sposobów obejścia tego, ale ...
Nie zapominajmy, że najlepszym sposobem, aby chronić się przed tym jest napisanie programu, który nie psuje. :-) Nie powinieneś tego widzieć, jeśli poprawnie używasz pamięci i nie wieszasz wątku GUI.
Zmiana zachowania się awarii aplikacji to świetny sposób na wprowadzenie subtelnych i śmiertelnych błędów. Zobacz także this blog post od firmy Microsoft Raymond Chen.
To James Cadd w prawo, aby zapobiec Microsoft od szpiegostwo na jego kodu, niezależnie od tego, czy jego awarii kodu lub niektóre dll MS nazywa awarii na 1 .% systemów klientów –
nie sądzę oni szpiegostwo na jego kodzie Wszystkie raporty o awariach znudzisz się do ich systemu Winqual gdzie deweloperzy widzą raportów o awariach do swoich aplikacji. http://en.wikipedia.org/ wiki/Winqual –
Tak, wszystkie deweloperów, którzy posiadają certyfikaty można zobaczyć raporty dla własnej aplikacji. w przypadku, gdy stwierdzono, że pracownicy firmy Microsoft nie może spojrzeć na raporty dla aplikacji 3rd-partyjnych? nie szukaj tej klauzuli w używaniu umowa - jej nie ma. –
- 1. Forever.js uruchamianie i ponowne uruchamianie wielu skryptów
- 2. Zapobieganie upraszczaniu rozwiązania
- 3. Zapobieganie awariom Program pokazujący kiedy przydział stos ślady
- 4. Ponowne uruchamianie scenariusza WPF
- 5. Ponowne uruchamianie Sidekiq
- 6. Ponowne uruchamianie zakończone niepowodzeniem i niezalecane testy
- 7. Odtwarzanie dźwięku i ponowne uruchamianie onclick
- 8. Wykrywanie i ponowne uruchamianie uszkodzonej aplikacji .NET
- 9. Ponowne uruchamianie procesu erlang i zachowanie stanu
- 10. Uruchamianie programu PowerPoint Viewer z wiersza poleceń w systemie Windows
- 11. Zapobieganie zamykaniu systemu Windows
- 12. Emulator Android przyspiesza ponowne uruchamianie
- 13. phpunit ponowne uruchamianie testów losowo
- 14. Uruchamianie programu skompilowanego pod Linuksem gcc pod Windows
- 15. Uruchamianie zadania Zaplanowane w systemie Windows z programu ASP.net
- 16. Formanty javascript wideo HTML5 - ponowne uruchamianie wideo
- 17. Automatyczne ponowne uruchamianie długich zadań w Julia
- 18. Ponowne uruchamianie menedżera jednostek z wyjątków
- 19. Prawidłowa obsługa ponownego ładowania i ponowne uruchamianie z AppletViewer
- 20. Jak tolerować ponowne uruchamianie RabbitMQ w Langohr?
- 21. Uruchamianie programu java z innego programu java
- 22. Ponowne uruchamianie crona po zmianie pliku crontab?
- 23. Ponowne uruchamianie zdalnych ziaren przy użyciu IPython.parallel
- 24. Ponowne uruchamianie demona dropboxa, jeśli działa
- 25. Ponowne uruchamianie serwera lotniczego czytającego starszą wartość
- 26. Plik wyjściowy programu PowerShell: zapobieganie zmianom kodowania
- 27. Węzeł js uruchamianie i zatrzymywanie usług Windows
- 28. Uruchamianie CMake na Windows
- 29. Uruchamianie programu Matlab w tle
- 30. Uruchamianie programu OpenMPI bez mpirun
Świetne rozwiązanie, usuwa WER dla wszystkich aplikacji. –