2014-10-20 30 views
5

Mini-core-dump özelliğini (__try/__ haricinde ve MiniDumpWriteDump() ile benim Qt uygulamasının Windows derlemesine ekledim), böylece uygulamamın/uygulamanın hiç çökmesi durumunda bir .dmp dosyası yazılacak. bana bakmak ve daha sonra hata ayıklamak için disk.Windows uygulamamı kasıtlı olarak kilitlemenin en iyi yolu nedir?

Oldukça iyi çalışıyor, ancak sınama için programımın çökmesini sağlamak için bilinen güvenilir bir yönteme sahip olmak isterim. Örneğin, GUI'de "şimdi kilitle" düğmesi olabilir ve kullanıcı tıkladığında uygulamanın kasıtlı olarak kilitlenmesine neden olur.

bir yolu yapmak, tabii ki, şu şekildedir:

int * badPointer = NULL; 
*badPointer = 666; 

Ve bu benim için çalışır, ancak tanımsız davranış dayanır çünkü bu yaklaşıma sevmiyorum - özellikle de C++ standardı 'un bir çökmeye neden olması için yukarıdaki kodu gerektirmiyor, bu nedenle (kod-avukat perspektifinden), yukarıdaki kod çalıştırıldığında derleyicinin gelecekteki bazı sürümlerinin çökmemesi mümkündür. daha "resmi" bir yaklaşım olarak

, bu çalıştı: Programı sonlandırmak yok, ama hayır, bu yüzden MiniCrashDump işleyicisi tetikler, Windows Yapılandırılmış İstisna neden olmaz

abort(); 

... .dmp dosyası yazılır.

Benim sorum şu, programımı çökertmek için bir "Resmi Doğru Yol" var mı? Windows API'nın arayabileceğim bir RaiseException() işlevine sahip olduğunu görüyorum, ancak uygun argümanların ne olduğundan emin değilim. Bu, gitmenin yolu mu yoksa kullanmanın daha iyi olabileceğine dair daha spesifik bir çağrı var mı?

+0

Ekranda çekiç. –

+1

Özellikle uygulamaya özel anahtar kelimeler ve davranışlar kullanıyorsunuz ve bir C++ özelliğinin bir gün bunun hakkında ne söyleyebileceğinden endişe ediyorsunuz? Elbette, RaiseException() resmi yoludur. –

+0

@HansPassant "Ben kötü niyetli NULL olduğunu bildiğimden beri ve" NULL işaretçisi tanımsız bir davranış olduğunu söyleyerek, "gibi gcc tarzı akıl-hileler yapmaya başlayabilir MSVC optimizer olarak beni çok endişe C++ spec değil, ben yapabilirsiniz Bunu yazıp "... ve sonra aniden çökme düğmem artık çökmez. :) –

cevap

3

Windows üzerinde çalıştığınızı biliyorsanız, geçersiz bir işaretçinin erişim ihlaline neden olması için son derece iyi bir yoldur - Windows C++ dilinden daha güçlü garantiler sağlar. C++, boş bir işaretçiyi işaretlemenin Tanımsız Davranış olduğunu belirtir, ancak Windows bunu bir erişim ihlali olarak tanımlar (bir erişim ihlali, Tanımsız Davranışın olası bir sonucudur, çünkü C++ ile ilgili olarak kabul edilebilirdir). Managing Virtual Memory itibaren

:

Windows NT, her işlemin adres uzaya bir emniyet tedbirini oluşturur. Her işlemin üst ve alt 65.536 baytları sistem tarafından kalıcı olarak ayrılmıştır. adres alanı Bu bölümler aralığı 00000000 -0000FFFF veya 7FFF0000 -7FFFFFFF bellek adres girişiminde tuzak sokak işaretçiler-işaretçiler aittir. Tesadüfen, bu adreslerdeki işaretçileri tespit etmek, bu adreslerdeki alt dört nibblesin (en sağdaki iki bayt) göz ardı edilmesiyle kolayca yapılabilir. Esasen, üst dört nibbles 0000 veya 7FFF ; diğer tüm değerler geçerli adresleri temsil eder. okumak veya boş gösterici (veya bir boş gösterici göre +/- 64 KB içinde herhangi pointer) yazma girişiminde, her zaman yükseltirim böylece

belleğin ilk sayfa her zaman, PAGE_NOACCESS olarak eşleştirilmiş erişim ihlali istisnası.

İlgili konular