2009-04-09 17 views
13

C/C++ kodunu sınamak için Hudson'ı sürekli bir tümleştirme sunucusu olarak kullanıyorum. Ne yazık ki, bellek bozulmasına neden olan bir yerde bir hata var, bu yüzden bazı Windows makinelerinde bazen okunamayan bir bellek başvurulan bir uygulama açıklayan bir "Uygulama Hatası" iletişim kutusu alırsınız. Bu iletişim kutusu açılır ve temel olarak manuel müdahale gerektirdiği için test çalışmasını askıya alır."Uygulama Hatası" iletişim kutusu devre dışı bırakılabilir mi?

Bu iletişim kutusunun görünmesini engellemenin bir yolu var mı? Böylece, test çalıştırması başarısız oluyor ve Hudson'da olduğu gibi bildiriliyor mu?

İletişim kutusunu göstermek yerine otomatik olarak bir minidump oluşturmak mümkün mü?

+0

Benzer: https://stackoverflow.com/questions/2284138/disable-debug-prompt-on-application-crash ve https://stackoverflow.com/questions/3561545/how-to-terminate-a-program -en-o-çökmesi-hangi-sadece-başarısız-a-birim-test – Vadzim

cevap

11
  1. Kullanım yanıt verme şeklini kontrol etmek için çeşitli _CrtSetReport işlevleri kullanabilirsiniz. Ayrıca bkz. this PC World article.
  2. Yapı makinenizde MS Visual Studio'unuz varsa, Uygulama Hataları yakalanacak ve bir iletişim kutusu açılacaktır. Bu iletişim kutularını (ve ayrıca Visual Studio'nun Just-In-Time Debugging özelliğini) devre dışı bırakmak için Dr. Watson'ı varsayılan sistem hata ayıklayıcısı olarak ayarlamak için drwtsn32.exe -i komutunu çalıştırın. Watson bir çekirdek çöplük oluşturacak ve sessizce çıkacak. (Bu Microsoft Bilgi Bankası makalesine bakın:. http://support.microsoft.com/kb/q121434/) Ayrıca programaticaly SetErrorMode kullanarak böyle bir şey yapabileceği
+1

Teşekkürler! Dr. Watson konfigürasyonunu geri yüklemek ve istememeyi ayarlamak tam da aradığım şeydi! – mch

+1

PC World makalesi boş görünüyor. Sonuç olarak, ilk alternatif herhangi bir yararlı cevap sağlamamaktadır. – skyking

-2

İstisnai yakalamak ve istediğiniz gibi işlemek için try/catch ifadesini kullanın.

+1

Denemek/yakalamak bildiğim kadarıyla, geçersiz bir bellek erişimi yakalayamaz. Ancak, – mch

+1

__try/__except olabilir. – ChrisV

1

devre dışı bırak hata raporlama yoluyla:

  • Sicil düzenleme - Microsoft \ PCHealth \ ErrorReporting \ ExclusionList \ HKEY_LOCAL_MACHINE \ SOFTWARE başvurunuzu eklemek VEYA
  • Gelişmiş 'e gidin Bilgisayarım üzerinde sağ tıklayın Sekme ve seçenek "raporlama devre dışı bırak hatası" seçim VEYA
  • Sen Bildirimi hizmeti hata bulmak, İdari araçları hizmetler konsoluna gidin özelliklerinize gidip devre dışı bırakabilir o
1

Bay nazikçe anlaşılacağı gibi, "Devre Dışı hata raporlama" C/C++ çalışma zamanı çeşitli hatalar (_CrtSetReportHook, _CrtSetReportMode, _CrtSetReportFile, _CrtSetReportHook2)

7

. Daha fazla bilgi için this makalesine bakın.

SetErrorMode(GetErrorMode() | SEM_NOGPFAULTERRORBOX); 

yukarıdaki 'OR' bizim arzu eklenmesiyle geçerli mod:

nasıl kullanılacağını basit bir örneği, aşağıdaki yapmaktır.

+1

Benzer bir şekilde, "_set_abort_behavior (0, _WRITE_ABORT_MSG);" adında bir uygulama çağırmak önemli olduğunu düşünüyorum, çünkü birileri "abort()" (hata ayıklamada hata ayıklama C++ istisnası IIRC için varsayılan davranış) çağırdığı için başvurunuzun başarısız olması durumunda . – pauldoo

2

rkb'nin söylediklerine ek olarak, Windows XP 64bit çalıştırıyorsanız, iki değer kümesi vardır. Her zamanki kayıt defteri konumunda olanlar ve Wow6432Node anahtarının altındakiler HKLM. Her ikisini de güncellemek için, 'u %SYSTEMROOT%\system32 ve %SYSTEMROOT%\SysWOW64'dan çalıştırın.

İlgili konular