Możesz spróbować użyć „catchpoint” ( catch throw
), aby zatrzymać debugger w punkcie, w którym generowany jest wyjątek.
Poniższy fragment podręcznika gdb opisuje funkcję catchpoint.
5.1.3 Ustawianie catchpointów
Możesz użyć punktów przechwytywania, aby spowodować zatrzymanie debugera dla niektórych rodzajów zdarzeń programu, takich jak wyjątki C ++ lub ładowanie biblioteki współużytkowanej. Użyj polecenia catch, aby ustawić punkt zaczepienia.
złapać zdarzenie
Zatrzymaj się, gdy nastąpi zdarzenie . zdarzenie może być dowolne z następujących:
tcatch zdarzenie
Ustaw punkt zaczepienia, który jest włączony tylko dla jednego przystanku. Punkt przechwytywania jest automatycznie usuwany po pierwszym złapaniu zdarzenia.
Użyj info break
polecenia, aby wyświetlić bieżące punkty zaczepienia.
Obecnie istnieją pewne ograniczenia dotyczące obsługi wyjątków C ++ (rzut przechwytywania i przechwytywanie) w GDB:
Jeśli wywołasz funkcję interaktywnie, GDB zwykle zwraca kontrolę po zakończeniu wykonywania funkcji. Jeśli jednak wywołanie wywoła wyjątek, wywołanie może ominąć mechanizm, który zwraca ci kontrolę i spowodować przerwanie programu lub po prostu kontynuowanie działania, aż osiągnie punkt przerwania, przechwyci sygnał, którego nasłuchuje GDB, lub zakończy działanie. Dzieje się tak nawet wtedy, gdy ustawisz punkt zaczepienia dla wyjątku; punkty przechwytywania wyjątków są wyłączone w wywołaniach interaktywnych.
Nie możesz interaktywnie zgłosić wyjątku.
Nie można zainstalować interaktywnej obsługi wyjątków.
Czasami catch nie jest najlepszym sposobem debugowania obsługi wyjątków: jeśli chcesz dokładnie wiedzieć, gdzie został zgłoszony wyjątek, lepiej zatrzymać się przed wywołaniem procedury obsługi wyjątków, ponieważ w ten sposób możesz zobaczyć stos przed jakimkolwiek odwinięciem. Jeśli zamiast tego ustawisz punkt przerwania w programie obsługi wyjątków, ustalenie, gdzie został zgłoszony wyjątek, może nie być łatwe.
Aby zatrzymać się tuż przed wywołaniem procedury obsługi wyjątków, potrzebujesz pewnej wiedzy na temat implementacji. W przypadku GNU C ++ wyjątki są zgłaszane przez wywołanie funkcji bibliotecznej o nazwie __raise_exception, która ma następujący interfejs ANSI C:
/* addr is where the exception identifier is stored.
id is the exception identifier. */
void __raise_exception (void **addr, void *id);
Aby debuger przechwytywał wszystkie wyjątki, zanim nastąpi rozwijanie stosu, ustaw punkt przerwania na __raise_exception (zobacz sekcję Punkty przerwania; punkty obserwacyjne; i wyjątki).
Za pomocą warunkowego punktu przerwania (zob. Sekcja Warunki przerwania), który zależy od wartości id, możesz zatrzymać program, gdy zostanie zgłoszony określony wyjątek. Możesz użyć wielu warunkowych punktów przerwania, aby zatrzymać program, gdy zostanie zgłoszony dowolny z wielu wyjątków.
handle SIGUSR1 pass noprint nostop