Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: navrocky от Октябрь 05, 2010, 09:53



Название: Ловля SIGSEGV через try/catch
Отправлено: navrocky от Октябрь 05, 2010, 09:53
Может кому пригодится моя либа по трансляции SIGSEGV и SIGFPE в исключения C++...

Проверено под: linux/gcc и windows/msvc, под windows/mingw почему-то не отрабатывает еще не разобрался (

Библиотека - http://code.google.com/p/segvcatch/
Документация - http://www.visualdata.ru/ext/segvcatch-doc
Статья по русски - http://www.visualdata.ru/blog/109-segv-signal.html

Код
C++ (Qt)
#include <iostream>
#include <stdexcept>
#include <segvcatch.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
   segvcatch::init_segv();
   segvcatch::init_fpe();
 
   try
   {
       *(int*) 0 = 0;
   }
   catch (std::exception& e)
   {
       std::cerr << "Exception catched : " << e.what() << std::endl;
   }
 
   try
   {
       int v = 0;
       std::cout << 10 / v << std::endl;
   }
   catch (std::exception& e)
   {
       std::cerr << "Exception catched : " << e.what() << std::endl;
   }
 
   std::cout << "We are living yet!" << std::endl;
 
   return 0;
}
 


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: ритт от Октябрь 05, 2010, 19:59
на мой взгляд - самое полезное "готовое решение" :)
ждём работоспособную реализацию под мингв...


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Igors от Октябрь 05, 2010, 20:35
А так что будет?
Код
C++ (Qt)
 try
   {
       float v = 0.0f;
       std::cout << 10 / v << std::endl;
   }
   catch (std::exception& e)
   {
       std::cerr << "Exception catched : " << e.what() << std::endl;
   }
 


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Igors от Октябрь 05, 2010, 21:30
на мой взгляд - самое полезное "готовое решение" :)
ждём работоспособную реализацию под мингв...
Цитировать
Блаженны нищие духом ибо не ведают они что творят
:)


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: navrocky от Октябрь 06, 2010, 09:34
А так что будет?
Код
C++ (Qt)
       float v = 0.0f;
       std::cout << 10 / v << std::endl;
 

Так деление на ноль будет, тоже поймается.

Цитировать
на мой взгляд - самое полезное "готовое решение"
ждём работоспособную реализацию под мингв...

Хитрый какой, а помочь? ;) хоть потестить...


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Igors от Октябрь 06, 2010, 17:51
А так что будет?
Код
C++ (Qt)
       float v = 0.0f;
       std::cout << 10 / v << std::endl;
 

Так деление на ноль будет, тоже поймается.
Однако ж не ловится - спокойно печатает "inf" и идет дальше.. ???


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: ритт от Октябрь 07, 2010, 02:59
Цитировать
на мой взгляд - самое полезное "готовое решение"
ждём работоспособную реализацию под мингв...

Хитрый какой, а помочь? ;) хоть потестить...
а оно мне не нужно))
я лишь выразил мысль, что, будь она кроссплатформенной, в целом штука потенциально полезная :P
успехов


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Igors от Октябрь 07, 2010, 13:21
я лишь выразил мысль, что, будь она кроссплатформенной, в целом штука потенциально полезная :P
Да, такую хотелось бы иметь, но в том-то и дело что (на любой платформе) она ловит "не все" а лишь "часть" (некоторых). Напр. чтение/запись по удаленному указателю может пойматься а может и нет (недавно обсуждали). То же и с арифметикой. Все равно нужны доп. проверки - а значит положиться на такой tool нельзя


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: navrocky от Октябрь 08, 2010, 12:24
Ну как бы для подстраховки полезно, я буду включать это в конечный релиз, для отладки оно конечно не особо полезно.

Цитировать
будь она кроссплатформенной
так и задумывается, не везде только протестировано

Цитировать
Однако ж не ловится - спокойно печатает "inf" и идет дальше..
Странно, но вообще зависит от ОС, компилятора, ключей компиляции..

В линуксе генерится SIGFPE который прибивает программу.


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Alexxey593 от Октябрь 11, 2010, 20:34
Попробуем. Проблема весьма насущна и решения я пока не нашел. Надеюсь данная либа поможет. Жаль, что пока под windows/Mingw не работает...


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Авварон от Октябрь 12, 2010, 13:05
Блин, вот я не понимаю - нафига ловить эксепшн о битых указателях? Почему у меня в программах а) нет утечек б) все указатели валидны? Неужели это так сложно - продумать программу заранее и определиться с временем жизни объектов?


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Igors от Октябрь 12, 2010, 13:40
Почему у меня в программах а) нет утечек б) все указатели валидны? Неужели это так сложно - продумать программу заранее и определиться с временем жизни объектов?
А вот у меня масса утечек и битых указателей  :) Кстати недавно поюзал "Leaks" - пусть не все но многое поймал, я доволен. Примерный набор

- не удалял созданный дескриптор (там где AECoerseDesc и.т.п)
- где-то в недрах OpenGL (не смог разобраться, отключил эту фичу)
- деструктор базового класса не был виртуальным
- по мелочам: new, потом выскочил через return и забыл delete
- std::map<int, myClass *> не было удаления для myClass *

ну и.т.п.


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Авварон от Октябрь 12, 2010, 15:53
У меня в программе 14000 строк было 3 утечки - 1 в полунаписанном модуле (модуль для экспериментов) и 2 раза забыл деструктор в классе, содержащем d_ptr. Как вы ухитряетесь так косячить?:)


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: Igors от Октябрь 12, 2010, 17:11
У меня в программе 14000 строк было 3 утечки - 1 в полунаписанном модуле (модуль для экспериментов) и 2 раза забыл деструктор в классе, содержащем d_ptr. Как вы ухитряетесь так косячить?:)
Ну во-первых там не я один, а главное - строк-то под миллион  :)


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: ufna от Октябрь 12, 2010, 17:53
ну скорее всего главное "не один", т.к. у меня в текущей программе тоже строк под миллион, но писалась единолично и для WinCE - как следствие за памятью был дичайший контроль.


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: navrocky от Октябрь 14, 2010, 16:03
Для меня частая ситуация - это не битые указатели и утечки, а доступ по нулевому указателю. Как правило забываются проверки.


Название: Re: Ловля SIGSEGV через try/catch
Отправлено: iukash от Май 01, 2011, 12:07
А может кто нибудь выложить пример использования этой библиотеки без использования cmake, а с обычным .pro файлом.