Wyjątki C++ są całkowicie różne od wyjątków Java.
C++ standard określa, że ciąg zwracany przez co() jest całkowicie arbitralne i wdrożenie zdefiniowane:
virtual const char* what() const noexcept;
Returns: An implementation-defined ntbs.
Remarks: The message may be a null-terminated multibyte string
(17.5.2.1.4.2), suitable for conversion
and display as a wstring (21.3, 22.4.1.4). The return value remains
valid until the exception object
from which it is obtained is destroyed or a non-const member
function of the exception object is called.
Wartością zwracaną dostajesz „std :: exception” jest idealnie zgodny z standard C++.
Nie polegaj na wyjątkach C++, aby dokładnie powiedzieć, skąd zostały one wyrzucone po ich przechwyceniu, tak jak robi to Java. Wykracza to poza zakres standardu C++. W C++ wyjątek jest tak naprawdę niczym więcej niż mechanizmem do przesyłania przepływu sterowania wykonaniem.
Powiedziawszy, że: wiele implementacji C++ zapewni ci pewne mechanizmy implementacji dla zrzucania bieżącego śladu po stosie, do najlepszych możliwości biblioteki środowiska wykonawczego. Sprawdź dokumentację kompilatora C++, aby uzyskać więcej informacji.
Na przykład gcc oferuje funkcję backtrace() wraz z niektórymi wewnętrznymi funkcjami gcc do konwersji nieprzetworzonych adresów zwracanych przez backtrace() na symbole i inne funkcje do odwzorowywania symboli. Używając tego, można wytworzyć szorstki analog do obsługi wyjątków Javy; chociaż implementacja gcc nie jest idealna i ma pewne luki funkcjonalne, a także wymaga wcześniejszego planowania i niestandardowych klas wyjątków, których konstruktorzy przechwytują bieżącą ramkę stosu (przed wyjątek jest faktycznie rzucany); i, po złapaniu, można rzucić wyrzuconą instancję klasy wyjątku dla przechwyconych informacji o śladach.
Ale to nie pomoże twojej obecnej sytuacji. Sugerowałbym, abyś sprawdził dokumentację kompilatora C++, tak jak zasugerowałem, a także zbadał możliwości twojego debuggera. Debuger C++ powinien umożliwiać ustawienie punktu przerwania, gdy wszystkie wyjątki są zgłaszane, a przed jego przechwyceniem, tak aby można było zbadać ślad stosu za pośrednictwem debuggera, gdy wystąpi wyjątek.
Czy otrzymujesz zrzut rdzenia, który możesz załadować do gdb i zrobić ślad śladu? –
Gdzie jest zgłaszany wyjątek? Jak jest rzucany? Jaki wyjątek został zgłoszony? Utwórz [Minimalny, kompletny i weryfikowalny przykład] (http://stackoverflow.com/help/mcve) i pokaż nam. –
To wydaje się niezwykłe dla wyjątku biblioteki GCC - oczekiwałbym bardziej specyficznej pochodnej klasy, takiej jak 'std :: runtime_error',' std :: length_error' itd. (Jeden z [tych] (http: //en.cppreference. com/w/cpp/error/exception)) z '.what()' komunikującym to. Myślę, że jest to prawdopodobnie z własnej bazy kodu. To może nie pomóc, ale gdybym był tobą, wypróbowałbym rekursywny grep dla '' throw \ s + std :: exception'' w twoim własnym kodzie, a jeśli to się nie pojawi, możesz wypróbować GCC nagłówki. –