LINUX.ORG.RU

не ловит catch


0

1

Имеется большой проект. При работе вылетает исключение

//---------------------------------------------------------------------------

terminate called after throwing an instance of 'std::runtime_error'

what(): select timeout

//---------------------------------------------------------------------------

попытка отловить его в главном цикле

//---------------------------------------------------------------------------

try

{

CApp theApp;

theApp.OnExecute(argc, argv);

}

catch(...)

{ printf(«catch runtime_error (main)\n»); }

//---------------------------------------------------------------------------

не увенчивается успехом. Что может быть причиной? Попытки найти породитель сего исключения - аналогично. Типичный printf не помогает - ошибка вылетает в разных кусках кода работы программы . Подскажите хоть что-нибудь, я в отчаянии. Почему исключение не ловится в главной функции?



Последнее исправление: Burns (всего исправлений: 6)

http://www.cplusplus.com/reference/std/exception/set_terminate/

Попытки найти породитель сего исключения - аналогично

http://www.delorie.com/gnu/docs/gdb/gdb_31.html

Что может быть причиной?

бросок исключения из «лапши» кода из С и С++, кто-то влепил не по делу throw(), бросок исключения из деструктора и даже использование разных компиляторов под разные куски кода

wota ★★
()

Попытки найти породитель сего исключения

Предполагаю, что шелл - bash. Перед запуском программы нужно написать «ulimit -c unlimited» и убедиться, что у программы есть права на запись в ее текущую директорию. Запустить программу и добиться ее поадения. В результате ты получишь надпись

terminate called after throwing an instance of 'int'
Аварийный останов (core dumped)

вместо обычной

terminate called after throwing an instance of 'int'
Аварийный останов

. В текущей директории появится файл с именем «core», или типа того. Теперь нужно написать «gdb -c <имя-core-файла> <имя-программы>», и внутри gdb написать «bt». Получишь точку, в которой было порождено исключение.

Альтернативный способ: написать «gdb <имя-программы>», и внутри gdb написать «run». Программа запустится, добиться ее падения. Написать внутри gdb «bt». Получишь точку, в которой было порождено исключение.

Manhunt ★★★★★
()
Ответ на: комментарий от wota

спасибо, отловить удалось... уже что-то. Насчет GDB, за пивом с другом он мне часто рассказывал, что очень удобная штука, но поскольку большинство, что я писал до этого, было для Windows, так не познакомился с ней. Сейчас почитаем

Burns
() автор топика
Ответ на: комментарий от Manhunt

Только просьба не троллить, а поправить ошибки, если будут. С линуксом знаком только на уровне программирования с помощью gcc и g++.

Проект собирается в Eclipse. На баше (надеюсь, это терминал) тоже запустил. Подскажите пожалуйста, в чем соль «ulimit -c unlimited»? запуск только этой строки, а также ulimit -c unlimited программа параметры ни к чему не приводят. Что-то выполнилось и без сообщений закрылось, файла core нет.

Было очень интересно, что когда я воспользовался последним способом, получил, что catch все-таки ловит ошибку, но почему через терминал нет???

(gdb) run Starting program: /home/burns/workspace/Finder_ns/Release/Finder_ns [Thread debugging using libthread_db enabled] catch runtime_error (main)

Program exited normally. (gdb) bt No stack. (gdb)

Burns
() автор топика
Ответ на: комментарий от Burns

Подскажите пожалуйста, в чем соль «ulimit -c unlimited»?

С практической точки зрения, это один из шагов, которые нужно проделать, чтобы начать получать core-файлы.

С технической точки зрения, это команда bash, которая позволяет задать resource limit под названием «RLIMIT_CORE» - Maximum size of core file. When 0 no core dump files are created. When nonzero, larger dumps are truncated to this size. Подробнее можно прочитать с помощью команд «man setrlimit» и «man core», которые нужно ввести в терминале.

запуск только этой строки, а также ulimit -c unlimited программа параметры ни к чему не приводят

Нужно ввести 2 строки:
1. Сначала «ulimit -c unlimited»
2. Затем «<программа> <параметры>»

Manhunt ★★★★★
()
Ответ на: комментарий от Manhunt

Все, разобрался, спасибо большое, ребят!!! Проблема была в запуске старой версии одного из модулей с двумя потоками(как мне объяснили). Исключение генерировалось в одном потоке, а пыталось отлавливаться в другом.

Отдельное спасибо за GDB. В первый раз ничего не удалось извлечь потому, что при запуске указал параметры командной строки приложения вторым аргументом gdb. Простите, только учусь =)

Burns
() автор топика
Ответ на: комментарий от Burns

В первый раз ничего не удалось извлечь потому, что при запуске указал параметры командной строки приложения вторым аргументом gdb.

Есличо, gdb --args <app> <args>

slovazap ★★★★★
()
Ответ на: комментарий от Burns

файла core нет

1) Смотри, что у тебя в /proc/sys/kernel/core_pattern прописано.

2) Проверь, что у исполняемого бинаря не выставлен SUID бит.

DELIRIUM ☆☆☆☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.