2009-04-09 8 views
13

Ich benutze Hudson als kontinuierliche Integration Server zum Testen von C/C++ - Code. Unglücklicherweise habe ich irgendwo einen Fehler, der Speicherbeschädigung verursacht. Auf manchen Windows-Rechnern bekomme ich manchmal ein "Anwendungsfehler" -Dialogfeld, das erklärt, dass eine Anweisung auf Speicher verweist, der nicht gelesen werden konnte. Diese Dialogbox erscheint und hält den Testlauf grundsätzlich an, da ein manuelles Eingreifen erforderlich ist.Kann das Dialogfeld "Anwendungsfehler" deaktiviert werden?

Gibt es eine Möglichkeit zu verhindern, dass dieses Dialogfeld angezeigt wird, so dass der Testlauf einfach fehlschlägt und als solcher in Hudson gemeldet wird?

Ist es möglich, automatisch einen Minidump zu generieren, anstatt den Dialog anzuzeigen?

+0

Ähnliche: https://stackoverflow.com/questions/2284138/disable-debug-prompt-on-application-crash und https://stackoverflow.com/questions/3561545/how-to-terminate-a-program -when-it-crashs-was-sollte-nur-fehlgeschlagen-ein-unit-test – Vadzim

Antwort

11
  1. Use "Fehlerberichterstattung deaktivieren" reagiert zu steuern, wie Herr vorsichtig vermuten lässt. Siehe auch this PC World article.
  2. Wenn Sie MS Visual Studio auf Ihrem Build-Rechner haben, fängt es Anwendungsfehler ab und öffnet ein Dialogfeld. Führen Sie den Befehl drwtsn32.exe -i aus, um Dr. Watson als den Standardsystemdebugger festzulegen, um diese Dialoge (und die Just-In-Time-Debugging-Feature von Visual Studio) zu deaktivieren. Dr. Watson wird einen Kernspeicherauszug erstellen und automatisch beenden. (Siehe das Microsoft Knowledge Base-Artikel:. http://support.microsoft.com/kb/q121434/)
+1

Danke! Wiederherstellen der Dr. Watson-Konfiguration und Einstellung, es nicht zu prompt war genau das, was ich suchte! – mch

+1

Der PC World Artikel scheint leer zu sein. Folglich liefert die erste Alternative keine nützliche Antwort. – skyking

-2

Verwenden Sie eine try/catch-Anweisung, um die Ausnahme abzufangen und so zu behandeln, wie Sie möchten.

+1

Try/catch kann keinen ungültigen Speicherzugriff abfangen, soweit ich weiß. – mch

+1

__try/__except kann jedoch. – ChrisV

1

Fehlerberichterstattung deaktivieren über:

  • Registrierung bearbeiten - fügen Sie Ihre Anwendung zu HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ PCHealth \ ErrorReporting \ ExclusionList, OR
  • Rechtsklick auf Arbeitsplatz, gehen Sie auf die Erweiterte Tab, und wählen Sie die „Fehlerberichterstattung deaktivieren“ Option, OR
  • Sie können in der Verwaltung an die Dienste-Konsole navigieren, finden Sie den Fehlerberichterstattungsdienst, gehen Sie in Eigenschaften und deaktivieren Sie es
1

Sie können die verschiedenen _CrtSetReport Funktionen verwenden, um die Art und Weise der C/C++ Runtime verschiedene Fehler (_CrtSetReportHook, _CrtSetReportMode, _CrtSetReportFile, _CrtSetReportHook2)

7

Sie auch so etwas tun kann programaticaly mit SetErrorMode. Siehe this Artikel für weitere Details.

Ein einfaches Beispiel dafür, wie es zu benutzen ist folgende zu tun:

SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX); 

Der oben ‚RUP‘ der aktuelle Modus mit unserem gewünschten Zusatz.

+1

In ähnlicher Weise denke ich, dass es wichtig ist, "_set_abort_behavior (0, _WRITE_ABORT_MSG);" aufzurufen, falls in der Zukunft Ihre Anwendung fehlschlägt, weil jemand "abort()" aufruft (Standardverhalten für eine nicht erfasste C++ Ausnahme in Debug builds IIRC) . – pauldoo

2

Zusätzlich zu dem, was rkb sagte, wenn Sie Windows XP 64bit ausführen, gibt es zwei Sätze von Werten. Die in der üblichen Registrierungsstelle und die unter dem Wow6432Node Schlüssel in HKLM. Um beide zu aktualisieren, führen Sie drwtsn32.exe -i von %SYSTEMROOT%\system32 und %SYSTEMROOT%\SysWOW64 aus.

Verwandte Themen