2016-03-30 20 views
3

Çok basit bir soru ama internette herhangi bir çözüm bulamıyorum.Qt'deki bir kilitlenme nasıl simüle edilir?

Qt uygulamasını çökmeye zorlamak mümkün mü?

Bu, yalnızca çökme raporunu denemek istediğim için geliştirme amacıyla yapılır.

#include <signal.h> 

void raiseSegfault() 
{ 
    int error = raise(SIGSEGV); 
    if (error != 0) { 
     std::cout << "cannot raise segfault" << std::endl; 
     exit(0); 
    } 
} 

Bu güvenilir bir segment hataya veya çıkışa yükseltecektir ve tanımsız davranış kullanan olmaz:

+0

'' 'QPushButton * '' düğmesiyle bir işaretçi oluşturun, ancak bunun bir örneği yok. '' '' '' '' 'Metodunu çağırmaya çalışın ve çökecektir (eğer sorunuzu doğru bir şekilde anladıysam) – Varius

+0

Bazı büyük demirler hariç olmak üzere, boş bir göstericinin yokluğu hemen hemen tüm platform Qt üzerinde çalışacaktır. mainframes), derleyici bunu optimize etmedikçe (standarda göre, yapabilir!). –

+0

Windows'ta, çöken bir DLL yazıp MS Detours ile işleminize enjekte edebilirsiniz. – MrEricSir

cevap

4

biz üzerinde StackOverflow :-) nereden

Unutma,

qFatal("boom"); 
+0

LOL, zamanın% 100'ünde çalışsa bile, muhtemelen bir kaza raporu için kullanamaz. Benim yaratıcılığım için oy vermeme rağmen :) – user1708860

+0

@ user1708860 denemedi, ancak uygun bir çökme raporu vereceğini söyleyebilirim. – Ilya

+0

sinyal 6, stackoverflow gibi bir iç hata oluştuğunda atılır. http://stackoverflow.com/questions/3413166/when-does-a-process-get-sigabrt-signal-6. Bu, yığın ayırma dahil olmak üzere, bu noktadan herhangi bir ayırmanın çalışmayabileceği anlamına gelir. Bu bir kaza raporu yapmak çok daha zorlaştırıyor ... (Bu konuda başka bir kaynak bulamıyorum, bu yüzden burada korkunç bir şekilde yanlış olabilirdim, bu çoğunlukla wer'e bizim sinyal işleyicilerimizle ne yapıyor?) – user1708860

0

Sen sinyal Linux kütüphanesini kullanarak bir segfault tetikleyebilir.

2

Bir istisna atar ve asla yakalamazsınız, bu sizin aradığınız şey olabilir veya olmayabilir.

Düzenleme: http://en.cppreference.com/w/cpp/utility/program/raise

sen * nix sistemleri kullanarak yapıyorsanız, raise çağrıyı kullanabilirsiniz:

bu çapraz platform en sağlam çözüm bulabildiğim olduğunu.

Halihazırda platform oluşturmaya çalıştığınız için çarpma raporu hazırladığınıza inanıyorum. Bir windows ortamında çalışacak benzer bir çözüm hakkında, muhtemelen var olan bir şey bilmiyorum. terbiyecisi ve daha Qt özgü bir şey için

int foo(int p) { 
    return foo(p)+foo(p); 
} 

foo(0); 

PS, sen qFatal deneyebilirsiniz:

İlgili konular