Schumi |
Отправлено: 04.08.2006, 14:19 |
|
Машинист паровоза
Группа: Участник
Сообщений: 206
|
Иногда хочется узнать имя функции, в которой произошла ошибка.
Я как делаю, объявляю глобальную переменную — строку, и соответственно в начале каждой функции пишу <переменн> = <имя функции>, а когда происходит исключение, его обрабатываю и использую данную переменную.
Но как-то это муторно, может можно как-то в рантайме вытянуть, ведь сообщение об ошибке получить можно
|
|
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 я все же не совсем представляю, как можно это использовать (чтобы было легко и просто ).
А с директивами тоже не очень.
Максимум, что вместо имеющихся:
CODE |
extern String msg;
....
void TClass:method(...)
{
msg = "TClass:method";
...
|
теперь будет:
CODE |
void TClass:method(...)
{
msg = __FUNC__;
...
|
Ведь, если и буду исключение перехватывать OnException, она будет генерить результаты директивы для функции обработки исключения, а не для ф-ции, где оно произошло.
Doga, так там только демо версия, а для проекта оставлять дебаг инфу не хочется
|
|
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 очень хорош для отладки, а для релиза (когда отдаетс я людям) как-то не очень
Отредактировано 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.
|
Так что, после запаковки отладочной информации, вряд ли там кто нибудь что то разберёт
У нас ExcMagic спокойно применяется и в релизах, правда крякакть наши продукты смысла нет — слишком специфические вещи
|
|
GoodWin |
Отправлено: 17.08.2006, 16:51 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 50
|
Doga, а ты не подскажешь адресок где можно скачать его ExcMagic
что то я его найти не могу. Или если не трудно вышли на goodwin.83@mail.ru.
Заранее благодарен |
|
Doga |
Отправлено: 11.09.2006, 20:13 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Привет!
Долго не отвечал т.к. был в отпуске.
Откуда мы его стянули уже никто не помнит, но точно с какого то китайского сайта
Почтой выслать пока не могу (по некоторым соображениям ), но завтра выложу на фирменном сервере. О чем собственно завтра и сообщу
|
|
Doga |
Отправлено: 12.09.2006, 13:01 |
|
Мастер участка
Группа: Участник
Сообщений: 575
|
Привет!
Сегодня выяснились подробности получения этого компонента. Оказывается, EMagic, был подарен моему коллеге в качестве рекламной акции, без права передачи третьим лицам. По этому, что бы не подводить своего коллегу, по этическим соображениям я его выкладывать не буду.
В свете выше сказанного остаётся два варианта. Либо купить EMagic официально, либо воспользоваться бесплатной библиотекой Jedi Code Project. Там имеется аналогичный компонент. Кстати, в составе Jedi Code Project присутствует и библиотека RxLib.
|
|
GoodWin |
Отправлено: 15.09.2006, 09:06 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 50
|
Я уже и сам ExcMagic нашел. Я с официального сайта скачал. Вроде писали что это демо-версия, но у меня она на ура и так работает. Непонятно чего там демо ) |
|
Admin |
Отправлено: 15.09.2006, 18:54 |
|
Владимир
Группа: Администратор
Сообщений: 1190
|
QUOTE | Иногда хочется узнать имя функции, в которой произошла ошибка.
Я как делаю, объявляю глобальную переменную — строку, и соответственно в начале каждой функции пишу <переменн> = <имя функции>, а когда происходит исключение, его обрабатываю и использую данную переменную.
|
Я в этих случаях еще ставлю точки прерывания на интересующие
места. Тогда можно пройтись в точке прерывания посмотреть на
значения переменных (наведя курсор мыши на код на интересующую
переменную). А поставить-убрать точки прерывания — простой
щелчок мыши — достаточно быстро.
|
|