İstisnanın üretildiği catch throw
noktada hata ayıklayıcıyı durdurmak için bir "catchpoint" ( ) kullanmayı deneyebilirsiniz .
Aşağıdaki gdb kılavuzundan alıntı , catchpoint özelliğini açıklamaktadır.
5.1.3 Hedef noktaları belirleme
C ++ istisnaları veya paylaşılan bir kitaplığın yüklenmesi gibi belirli program olayları türleri için hata ayıklayıcının durmasına neden olmak için yakalama noktalarını kullanabilirsiniz. Bir yakalama noktası ayarlamak için catch komutunu kullanın.
olayı yakalamak
Ne zaman durdurun olay meydana gelir. olay aşağıdakilerden herhangi biri olabilir:
tcatch olayı
Yalnızca bir durak için etkinleştirilen bir yakalama noktası ayarlayın. Olay ilk yakalandıktan sonra yakalama noktası otomatik olarak silinir.
info break
Mevcut yakalama noktalarını listelemek için komutu kullanın .
Şu anda GDB'de C ++ istisna işlemede (yakalama ve yakalama yakalama) bazı sınırlamalar vardır:
Bir işlevi etkileşimli olarak çağırırsanız, GDB normalde işlevin yürütülmesi bittiğinde kontrolü size geri verir. Ancak çağrı bir istisna yaratırsa, çağrı kontrolü size geri döndüren mekanizmayı atlayabilir ve programınızın durdurulmasına veya bir kesme noktasına gelene kadar çalışmaya devam etmesine, GDB'nin dinlediği bir sinyali yakalamasına veya çıkmasına neden olabilir. İstisna için bir kapanış noktası belirleseniz bile durum budur; istisnalar üzerindeki yakalama noktaları etkileşimli aramalarda devre dışı bırakılır.
Etkileşimli olarak bir istisna oluşturamazsınız.
Etkileşimli olarak bir istisna işleyicisi kuramazsınız.
Bazen catch, istisna işlemede hata ayıklamanın en iyi yolu değildir: Bir istisnanın tam olarak nerede ortaya çıktığını bilmeniz gerekiyorsa, istisna işleyicisi çağrılmadan önce durmanız daha iyidir, çünkü bu şekilde herhangi bir çözülme gerçekleşmeden önce yığını görebilirsiniz. Bunun yerine bir istisna işleyicide bir kesme noktası ayarlarsanız, istisnanın nerede ortaya çıktığını bulmak kolay olmayabilir.
Bir istisna işleyicisi çağrılmadan hemen önce durmak için, uygulama hakkında biraz bilgi sahibi olmanız gerekir. GNU C ++ durumunda, aşağıdaki ANSI C arayüzüne sahip __raise_exception adlı bir kütüphane işlevi çağrılarak istisnalar ortaya çıkar:
/* addr is where the exception identifier is stored.
id is the exception identifier. */
void __raise_exception (void **addr, void *id);
Herhangi bir yığın çözülmeden önce hata ayıklayıcının tüm istisnaları yakalamasını sağlamak için __raise_exception üzerine bir kesme noktası ayarlayın (bkz. Bölüm Kesme noktaları; izleme noktaları ve istisnalar).
İd değerine bağlı olan koşullu bir kesme noktasıyla (bkz. Kesme koşulları bölümü), belirli bir istisna ortaya çıktığında programınızı durdurabilirsiniz. Çok sayıda istisna ortaya çıktığında programınızı durdurmak için birden çok koşullu kesme noktası kullanabilirsiniz.
handle SIGUSR1 pass noprint nostop