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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Ошибка  (Прочитано 10049 раз)
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #15 : Декабрь 14, 2012, 13:27 »

Вместо этих словесных переливаний интересно было бы (по ходу дела) узнать а почему assert не ловится через catch (..)
Дык коли он С-шный и вызывает abort() (SIGABRT(6)), какие уж здесь кетчеры?
Остаётся вешать signal handler.
Записан

Qt 5.11/4.8.7 (X11/Win)
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #16 : Декабрь 14, 2012, 14:37 »

исключений же нету в С. но можно пробовать ловить сигналы в юниксах (про винду не знаю, но думаю там тоже есть возможность задать коллбэк).

добавлено: ой, не заметил, что уже есть ответ на новой странице Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Декабрь 14, 2012, 14:58 »

исключений же нету в С.
Хмм... не уверен. Синтаксиса try/catch нет, это да. Но почему С-шная библиотечная ф-ция не может испустить исключение? (возможно даже и не ++ исключение)

Да, на nix OC дело сводится у abort(), это хорошо видно в отладчике. Но что на Вындоуз - хз. Выгоднее считать "делом реализации"  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #18 : Декабрь 14, 2012, 15:27 »

как тогда будет выглядеть пускание исключения в С? там же всё завязано на кодах ошибок, возвращаемых из функций. разве можно «провалиться» в стеке дальше, чем на 1 шаг, как в случае с исключениями в С++?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Декабрь 14, 2012, 15:44 »

как тогда будет выглядеть пускание исключения в С? там же всё завязано на кодах ошибок, возвращаемых из функций. разве можно «провалиться» в стеке дальше, чем на 1 шаг, как в случае с исключениями в С++?
Можно через longjmp, правда без всяких авто-откатов деструкторов. Но я говорю не об исключениях вообще - как бы с точки зрения процессора, а не С++.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #20 : Декабрь 14, 2012, 15:52 »

с ассемблером дел никогда не имел, но насколько я понимаю, для использования longjmp нужно знать куда (в какую функция) «прыгать». как же может сторонняя библиотека знать об этом — получать указатель на «коллбэк»-функцию, в которую осуществлять «прыжок»? или я всё в корне неправильно понимаю? Улыбающийся

да, и можно примерчик, чтобы посмотреть как это работает?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Декабрь 14, 2012, 16:21 »

с ассемблером дел никогда не имел, но насколько я понимаю, для использования longjmp нужно знать куда (в какую функция) «прыгать». как же может сторонняя библиотека знать об этом — получать указатель на «коллбэк»-функцию, в которую осуществлять «прыжок»? или я всё в корне неправильно понимаю? Улыбающийся

да, и можно примерчик, чтобы посмотреть как это работает?
Можно глянуть в С++ reference (хороший справочник). А есть и в Qt, т.к. используется libJPG а там longjmp (в примечаниях тролли неоднократно ноют об отсутствии авто-деструкторов  Улыбающийся)

Сам "прыжок" - дело нехитрое. Есть глобальные переменные (сохраненные при вызове setjmp). Это

- адрес самого кода (точки на которую спрыгнуть), получить просто LEA
- значение регистра стека

Просто установили стек да передали управление "длинным jump'ом". Как бы "зачеркнуть всю жизнь да сначала начать". Ну а что там произошло "в старой жизни" - память распределили, файлы открыли и.т.п. - то уже разбирайтесь сами как это все зачистить.

Конечно, exception куда приятнее, но мне кажется оно не дает того понимания как работает машина, и это важно. Хотя возможно все это лишь ностальгия старого пердуна  Улыбающийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #22 : Декабрь 14, 2012, 16:25 »

Помнится в ранних версиях g++ исключения именно через longjmp() и делались.
Записан

Qt 5.11/4.8.7 (X11/Win)
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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