2011-04-19 16 views
11

mogę powiedzieć debuggera gdb, aby zatrzymać tak szybko, jak każdy C wyjątek ++ jest wyrzucane przez ustawienie catchpoint pomocą polecenia gdbpunkt wstrzymania gdb dla nieprzechwyconych wyjątków C++?

catch throw 

jednak, czy jest jakiś sposób, aby zatrzymać tylko na Uncaught wyjątków C++ (jak w języku C# lub Java)? Ułatwiłoby to znajdowanie błędów w niektórych sytuacjach.

Dzięki!

+0

pokrewne - [Jak znaleźć miejsce, w którym został zgłoszony wyjątek w C++?] (Http://stackoverflow.com/q/2443135/203667) – jschmier

+0

Nie sądzę, że rozumiem - jak określić, czy wyjątek nie jest inny, niż pozwalając, by rozwinął się, dopóki nie przekroczył granicy prawa? – Mat

+0

Cóż, myślę, że gdb musiałoby sprawdzić, czy wyjątek został złapany czy nie * przed * faktycznym rozwinięciem stosu. Nie wiem, jak rozwiązuje to C# lub Java, ale jestem ciekawy, czy można to zrobić w C++. – emkey08

Odpowiedz

11

Jeśli wyjątek jest nieprzechwycony, funkcja specjalnej biblioteki zostaje automatycznie wywołana. Terminate jest w rzeczywistości wskaźnikiem do funkcji, a domyślną wartością jest funkcja biblioteki standardowej C abort(). Możesz może być w stanie ustawić punkt przerwania połączenia do funkcji abort() i określić położenie niezatrzymanego wyjątku stamtąd.

break abort 
... 
run 
... 
bt 

można zainstalować własną terminate() funkcję używając std::set_terminate(). Powinieneś być w stanie ustawić punkt przerwania na swojej funkcji kończącej w gdb. Możesz może być w stanie wygenerować ślad stosu ze swojej funkcji terminate() i ten ślad śledzenia może być pomocny w określeniu lokalizacji wyjątku. Dodatkowe informacje są dostępne pod numerem here.

+0

Dzięki, działa dla mnie z set_terminate() - używając g ++ 4.5.0, gdb 7.2 – emkey08

Powiązane problemy