C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Обработка исключение, Определение имени функции
Schumi
Отправлено: 04.08.2006, 14:19


Машинист паровоза

Группа: Участник
Сообщений: 206



Иногда хочется узнать имя функции, в которой произошла ошибка.
Я как делаю, объявляю глобальную переменную — строку, и соответственно в начале каждой функции пишу <переменн> = <имя функции>, а когда происходит исключение, его обрабатываю и использую данную переменную.

Но как-то это муторно, может можно как-то в рантайме вытянуть, ведь сообщение об ошибке получить можно smile.gif
Gedeon
Отправлено: 04.08.2006, 14:43


Ветеран

Группа: Модератор
Сообщений: 1742



Можно, но как не помню, однако Вы можете заюзать макрос assert
QUOTE

Данный макрос полезен для включения диагностики в программы. При выполнении assert, если значение выражения expression — ложь (0), assert выводит в стандартный протокол сообщение:

Assertion failed: expression, file xyz, line nnn


и аварийно завершается. В сообщении об ошибке xyz — это имя исходного файла, nnn — номер строки в исходном тексте, содержащей данный оператор assert.
CyberMind
Отправлено: 04.08.2006, 15:14


Ученик-кочегар

Группа: Участник
Сообщений: 29



Макрос __FUNC__. А еще прикольные макросы __FILE__ и __LINE__ — возвращают имя файла программы и текущую строку. Удобно использовать в своих логах.

Отредактировано CyberMind — 04/08/2006, 15:17
Doga
Отправлено: 04.08.2006, 16:38


Мастер участка

Группа: Участник
Сообщений: 575



Есть такой компонент — ExcMagic. Всё что нужно, он делать умеет.
Schumi
Отправлено: 04.08.2006, 17:01


Машинист паровоза

Группа: Участник
Сообщений: 206



Gedeon, плохо, что он в любом случае завершает работу программы, а хотелось бы иногда продолжить выполнение.

Gedeon, CyberMind я все же не совсем представляю, как можно это использовать (чтобы было легко и просто smile.gif).
А с директивами тоже не очень.
Максимум, что вместо имеющихся:
CODE

extern String msg;
....
void TClass:method(...)
{
msg = "TClass:method";
...

теперь будет:
CODE

void TClass:method(...)
{
msg = __FUNC__;
...


Ведь, если и буду исключение перехватывать OnException, она будет генерить результаты директивы для функции обработки исключения, а не для ф-ции, где оно произошло.

Doga, так там только демо версия, а для проекта оставлять дебаг инфу не хочется sad.gif
Doga
Отправлено: 04.08.2006, 18:54


Мастер участка

Группа: Участник
Сообщений: 575



Всё равно, на этапе отладки очень полезная вещь.

К тому же TDS файл можно запаковать и присоединить к ЕХЕшнику...

Отредактировано Doga — 04/08/2006, 18:58
Schumi
Отправлено: 05.08.2006, 09:45


Машинист паровоза

Группа: Участник
Сообщений: 206



QUOTE (Doga @ 04/08/2006, 18:54)
К тому же TDS файл можно запаковать и присоединить к ЕХЕшнику...

это как?

В общем ExcMagic очень хорош для отладки, а для релиза (когда отдаетс я людям) как-то не очень sad.gif

Отредактировано Schumi — 05/08/2006, 09:48
Doga
Отправлено: 06.08.2006, 16:14


Мастер участка

Группа: Участник
Сообщений: 575



В составе компонента есть спец. утилитка — tdspack.exe

Вот что она умеет:
QUOTE

Usage  : TDSPack [options] infile [outfile]

Infile : EXE-file or TDS-file

Options:
-a Append debug-info to EXE

-e Remove debug-info from EXE.
 Like a Borland's tdstrip utility.

-n Remove from debug info all information about procedures
 and their names.
 Reduces size of debuginfo very significantly.
 Resulting debug-info will contain only
 names of source files and linenumbers info.

 NOTE: works only when -o option is specified.

-o Optimize debug-info.
 Remove from debug-info all data that not used by
 ExceptionalMagic and pack remaining data.


Так что, после запаковки отладочной информации, вряд ли там кто нибудь что то разберёт smile.gif

У нас ExcMagic спокойно применяется и в релизах, правда крякакть наши продукты смысла нет — слишком специфические вещи smile.gif
GoodWin
Отправлено: 17.08.2006, 16:51


Дежурный стрелочник

Группа: Участник
Сообщений: 50



Doga, а ты не подскажешь адресок где можно скачать его ExcMagic
что то я его найти не могу. Или если не трудно вышли на goodwin.83@mail.ru.
Заранее благодарен
Doga
Отправлено: 11.09.2006, 20:13


Мастер участка

Группа: Участник
Сообщений: 575



Привет!

Долго не отвечал т.к. был в отпуске.

Откуда мы его стянули уже никто не помнит, но точно с какого то китайского сайта wink.gif

Почтой выслать пока не могу (по некоторым соображениям smile.gif ), но завтра выложу на фирменном сервере. О чем собственно завтра и сообщу cool.gif
Doga
Отправлено: 12.09.2006, 13:01


Мастер участка

Группа: Участник
Сообщений: 575



Привет!

Сегодня выяснились подробности получения этого компонента. Оказывается, EMagic, был подарен моему коллеге в качестве рекламной акции, без права передачи третьим лицам. По этому, что бы не подводить своего коллегу, по этическим соображениям я его выкладывать не буду. cool.gif

В свете выше сказанного остаётся два варианта. Либо купить EMagic официально, либо воспользоваться бесплатной библиотекой Jedi Code Project. Там имеется аналогичный компонент. Кстати, в составе Jedi Code Project присутствует и библиотека RxLib.
GoodWin
Отправлено: 15.09.2006, 09:06


Дежурный стрелочник

Группа: Участник
Сообщений: 50



Я уже и сам ExcMagic нашел. Я с официального сайта скачал. Вроде писали что это демо-версия, но у меня она на ура и так работает. Непонятно чего там демо )
Admin
Отправлено: 15.09.2006, 18:54


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE
Иногда хочется узнать имя функции, в которой произошла ошибка.
Я как делаю, объявляю глобальную переменную — строку, и соответственно в начале каждой функции пишу <переменн> = <имя функции>, а когда происходит исключение, его обрабатываю и использую данную переменную.


Я в этих случаях еще ставлю точки прерывания на интересующие
места. Тогда можно пройтись в точке прерывания посмотреть на
значения переменных (наведя курсор мыши на код на интересующую
переменную). А поставить-убрать точки прерывания — простой
щелчок мыши — достаточно быстро.

Вернуться в Вопросы программирования в C++Builder