Получить любой номер строки std:logic_error

Моя программа на C++ завершается с ошибкой std::logic_error, и я хотел бы отследить исходную строку, вызвавшую ее. Как я могу это сделать?

TBH, я использую gdb, используя g++ -g, чтобы добавить информацию об отладке. Все, что я могу получить, это эти сообщения:

Это приложение запросило у среды выполнения необычное завершение его работы. Пожалуйста, свяжитесь со службой поддержки приложения для получения дополнительной информации. завершение вызывается после создания экземпляра 'std::logic_error' what(): basic_string::_S_construct null недействителен

Catchpoint 1 (exception thrown), 0x0045ffa0 in __cxa_throw ()
(gdb) bt
#0  0x0045ffa0 in __cxa_throw ()
#1  0x004601e8 in std::__throw_logic_error(char const*) ()
#2  0x00502238 in typeinfo for std::__timepunct<wchar_t> ()
#3  0x004685f8 in std::runtime_error::what() const ()
#4  0x03210da8 in ?? ()
#5  0x002efbcc in ?? ()
#6  0x00468734 in std::domain_error::~domain_error() ()
#7  0x00000000 in ?? ()
(gdb)

person Mael    schedule 25.03.2012    source источник


Ответы (2)


Объекты-исключения не несут с собой никакой исходной информации. Однако мы надеемся, что они содержат полезное сообщение, доступное с помощью члена what(). Кроме этого, вам придется либо использовать отладчик, позволяющий прерывать работу при возникновении исключений, либо устанавливать точку останова в конструкторе std::logic_error. Пока исключения являются исключительными, это работает нормально. Это не слишком хорошо работает с кодом, выбрасывающим исключения в неисключительных случаях.

person Dietmar Kühl    schedule 25.03.2012
comment
Спасибо, ваш ответ на самом деле правильный, но я забыл упомянуть, что пытаюсь использовать g++ и gdb. - person Mael; 25.03.2012

Вы используете отладчик.

Использование инструментов отладчика — очень важный навык для изучения компилируемых языков, таких как C и C++.

person orlp    schedule 25.03.2012