Russian Qt Forum
Ноябрь 06, 2024, 06:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ловля SIGSEGV через try/catch  (Прочитано 15669 раз)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« : Октябрь 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;
}
 
Записан

Гугль в помощь
ритт
Гость
« Ответ #1 : Октябрь 05, 2010, 19:59 »

на мой взгляд - самое полезное "готовое решение" Улыбающийся
ждём работоспособную реализацию под мингв...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Октябрь 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;
   }
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Октябрь 05, 2010, 21:30 »

на мой взгляд - самое полезное "готовое решение" Улыбающийся
ждём работоспособную реализацию под мингв...
Цитировать
Блаженны нищие духом ибо не ведают они что творят
Улыбающийся
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Октябрь 06, 2010, 09:34 »

А так что будет?
Код
C++ (Qt)
       float v = 0.0f;
       std::cout << 10 / v << std::endl;
 

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

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

Хитрый какой, а помочь? Подмигивающий хоть потестить...
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 06, 2010, 17:51 »

А так что будет?
Код
C++ (Qt)
       float v = 0.0f;
       std::cout << 10 / v << std::endl;
 

Так деление на ноль будет, тоже поймается.
Однако ж не ловится - спокойно печатает "inf" и идет дальше.. Непонимающий
Записан
ритт
Гость
« Ответ #6 : Октябрь 07, 2010, 02:59 »

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

Хитрый какой, а помочь? Подмигивающий хоть потестить...
а оно мне не нужно))
я лишь выразил мысль, что, будь она кроссплатформенной, в целом штука потенциально полезная Показает язык
успехов
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Октябрь 07, 2010, 13:21 »

я лишь выразил мысль, что, будь она кроссплатформенной, в целом штука потенциально полезная Показает язык
Да, такую хотелось бы иметь, но в том-то и дело что (на любой платформе) она ловит "не все" а лишь "часть" (некоторых). Напр. чтение/запись по удаленному указателю может пойматься а может и нет (недавно обсуждали). То же и с арифметикой. Все равно нужны доп. проверки - а значит положиться на такой tool нельзя
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #8 : Октябрь 08, 2010, 12:24 »

Ну как бы для подстраховки полезно, я буду включать это в конечный релиз, для отладки оно конечно не особо полезно.

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

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

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

Гугль в помощь
Alexxey593
Гость
« Ответ #9 : Октябрь 11, 2010, 20:34 »

Попробуем. Проблема весьма насущна и решения я пока не нашел. Надеюсь данная либа поможет. Жаль, что пока под windows/Mingw не работает...
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #10 : Октябрь 12, 2010, 13:05 »

Блин, вот я не понимаю - нафига ловить эксепшн о битых указателях? Почему у меня в программах а) нет утечек б) все указатели валидны? Неужели это так сложно - продумать программу заранее и определиться с временем жизни объектов?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Октябрь 12, 2010, 13:40 »

Почему у меня в программах а) нет утечек б) все указатели валидны? Неужели это так сложно - продумать программу заранее и определиться с временем жизни объектов?
А вот у меня масса утечек и битых указателей  Улыбающийся Кстати недавно поюзал "Leaks" - пусть не все но многое поймал, я доволен. Примерный набор

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

ну и.т.п.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #12 : Октябрь 12, 2010, 15:53 »

У меня в программе 14000 строк было 3 утечки - 1 в полунаписанном модуле (модуль для экспериментов) и 2 раза забыл деструктор в классе, содержащем d_ptr. Как вы ухитряетесь так косячить?Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Октябрь 12, 2010, 17:11 »

У меня в программе 14000 строк было 3 утечки - 1 в полунаписанном модуле (модуль для экспериментов) и 2 раза забыл деструктор в классе, содержащем d_ptr. Как вы ухитряетесь так косячить?Улыбающийся
Ну во-первых там не я один, а главное - строк-то под миллион  Улыбающийся
Записан
ufna
Гость
« Ответ #14 : Октябрь 12, 2010, 17:53 »

ну скорее всего главное "не один", т.к. у меня в текущей программе тоже строк под миллион, но писалась единолично и для WinCE - как следствие за памятью был дичайший контроль.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.119 секунд. Запросов: 23.