Bir İstisna oluşana Kadar GDB Uygulamayı çalıştırmak
Çok iş parçacıklı bir uygulama üzerinde çalışıyorum, ve GDB kullanarak hata ayıklamak istiyorum.
Sorun benim iş parçacığı bir ileti ölüyor:
pure virtual method called
terminate called without an active exception
Abort
Bu mesajı neden biliyorum, ama benim iplik oluştuğu hakkında hiçbir fikrim yok. Bir geri iz gerçekten yararlı olacaktır.
GDB içinde uygulamamı çalıştırdığımda, bir iş parçacığı askıya alınmış veya devam her zaman duraklar. Benim uygulama iş parçacığı bir noktada her şeyin bir geri iz alabilirim, böylece durdurmak gerekir, bu durum, birlikte ölecek kadar normal olarak çalışmaya devam etmek istiyorum.
CEVAP
Bir "" (catch throw) özel durum oluşturulur noktada. hata ayıklayıcı durdurmak için catchpoint kullanmayı deneyebilirsiniz
Gdb manuel excerpt aşağıdaki catchpoint özelliği anlatılmaktadır.
< / ^ hr .
5.1.3 catchpoints Ayarı
Catchpoints hata ayıklayıcı program olayları, C özel durumlar veya paylaşımlı bir kitaplık yükleme gibi belirli türde için durdurmak için neden olur. Catch komutu bir catchpoint ayarlamak için kullanın.
yakalaolay
Ne zaman durolayoluşur. olay aşağıdakilerden biri olabilir:
at
C bir istisna atma.
yakala
C bir istisna yakalamak.
exec
Bir ara exec. Şu anda HP-UX için kullanılabilir.
çatal
Bir ara çatal. Şu anda HP-UX için kullanılabilir.
vfork
Bir ara vfork. Şu anda HP-UX için kullanılabilir.
yükyayük libname
Herhangi bir dinamik yükleme kitaplık veya kütüphane libname yükleme paylaştı. Şu anda HP-UX için kullanılabilir.
boşaltınyalibname boşaltın
Herhangi bir dinamik olarak kaldırılmasını paylaşılan kitaplık veya kütüphane libname kaldırılmasını yüklendi. Şu anda HP-UX için kullanılabilir.
tcatch olay
Sadece bir durdurmak için etkin bir catchpoint ayarlayın. Bu catchpoint otomatik olarak olay yakalanıyor sonra ilk kez silinir.
info break komutu geçerli catchpoints listelemek için kullanın.
Şu anda C GDB özel durum işleme (at yakalamak yakalamak) için bazı sınırlamalar vardır:
* If you call a function interactively, GDB normally returns control to you when the function has finished executing. If the call raises an exception, however, the call may bypass the mechanism that returns control to you and cause your program either to abort or to simply continue running until it hits a breakpoint, catches a signal that GDB is listening for, or exits. This is the case even if you set a catchpoint for the exception; catchpoints on exceptions are disabled within interactive calls.
* You cannot raise an exception interactively.
* You cannot install an exception handler interactively.
Bazen yakalamak değil en iyi yolu, hata ayıklama özel durum işleme: illa bilmek istiyorsan tam olarak nerede bir istisnadır büyüttüm, daha iyi durdurmak önce bir istisna işleyicisi olarak adlandırılan bu yana bu şekilde görebilirsiniz yığını önce herhangi bir çözülme gerçekleşir. Eğer bir özel durum işleyicisi içinde bir kesme noktası yerine ayarlarsanız, özel durumu oluşturuldu bulmak için kolay olmayabilir.
Bir özel durum işleyicisi denir önce durdurmak için, uygulama bilgisine ihtiyacım var. GNU C durumunda , istisna bir kütüphane işlevi __adlı_istisna yükseltmeyi aşağıdaki C arabirimi bir ANSI vardır: tarafından yetiştirilir
/* addr is where the exception identifier is stored.
id is the exception identifier. */
void __raise_exception (void **addr, void *id);
Hata ayıklayıcı herhangi bir çözülme yığını önce tüm özel durumları yakalamak için gerçekleşir, __bir kesme noktası ayarlayın_istisna (bölüm Kesme; dikkat edilmesi gereken hususlar; ve istisnalar) kaldırın.
Id değerine bağlı koşullu kesme noktası (bölüm Sonu koşulları ile, belirli bir özel durum ortaya çıktığında programı durdurabilirsiniz. Birden çok koşullu kesme noktaları istisnalar bir dizi herhangi yükseldiği zaman programınızı durdurmak için kullanabilirsiniz.

Kullanarak Gradle türleri bir cihazda ...
İOS için ayrıştırma: uygulamayı çalışt...
Ne kadar Ulvi metinden Python kodunu ç...
Nasıl kendi süreci gibi node.js bir uy...
Bozulana kadar tekrar tekrar kabuk kom...