Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/21: Рейтинг темы: голосов - 21, средняя оценка - 4.86
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194

#define and debug_mode

04.02.2016, 10:51. Показов 4556. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся с необходимостью использовать при отладке довольно внушительные куски кода.
(ранее решил проблему с мелкими кусками)(смотри код)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Закомментируйте чтоб отключить debug mode
//#define DEBUG_MODE
 
#define DIR_TO_LOG "C:\\some_module_log"
 
#ifdef DEBUG_MODE
    #define CLEAR_LOG_DIR {std::system("del /q "DIR_TO_LOG);}
    #define LogToFile(filename, log) {ofstream file(std::string(DIR_TO_LOG) + filename, ios::app); file << log << std::endl; file.close();}
    #define Log(log) {ofstream file(DIR_TO_LOG"log.txt", ios::app); file << log << std::endl; file.close();}
 
#else
    #define CLEAR_LOG_DIR
    #define LogToFile(filename, log)
    #define Log(log)
    
#endif
Такой подход хорошо работал для вывода мелкой отладочной информации, и по файлам легко можно было в блокноте проследить логику выполнения кода и её (логики) соответствие задуманной.

Но теперь мне исключительно для отладки понадобилось исполнять циклы, делать вычисления и прочее
И пришла в голову гениальная идея

C++
1
2
#define StartDebugBlock /*
#define EndDebugBlock */
Но увы эта простая и элегантная идея разбилась о реальность

Или может есть какой нибудь лайфхак в этом стиле?

Добавлено через 24 минуты
Много всего перепробовал. Ответ нашелся. И всё оказалось очень просто
прямо в *.cpp файле
C++
1
2
3
4
#ifdef DEBUG_MODE
SomeBigCODE();
Another_one;
#endif
Добавлено через 2 минуты
Ну и конечно ещё раз спасибо автору статьи.
https://www.cyberforum.ru/blogs/18334/blog100.html
Перечитав которую ещё раз - понял это простое и правильное решение.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.02.2016, 10:51
Ответы с готовыми решениями:

#define
#define зачем нужна это заголовочный файл какие у него функции и как им ползоватса?

c++11 и $define
Есть код который прекрасно компилируется без -std=c++11, но как только я включаю эту опцию то константы препроцессора не заменяются и...

C++define
Люди добрые , помогите советом ! Фрагмент с кодом самого метода : #include &lt;iostream&gt; // для std :: cout #include...

45
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.02.2016, 15:01
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
лог под макросом нужен, что бы выпилить его из компиляции.
что бы не просаживал рантайм вычислениями.
Спасибо, кэп. Как это опровергает
Цитата Сообщение от ct0r
Тыканье макросов в хвост и гриву - шляпа...
?
Если ты везде тыкаешь макросы, знать не зная узкие места (хотя из твоей фразы любое логирование оказывается просаживает! производительность, ужас, как с этим жить?), то кто будет виноват в фигово написанном коде?
Более того, нормальные люди вообще делают какой-нибудь ключ в бинарнике типа -d для вывода нужной отладочной инфы. И пофиг, собран дебаг то или релиз.

Цитата Сообщение от hoggy Посмотреть сообщение
и да, нет ни одной хорошей библиотеки для логов.
вообще ни одной.
1) Это твое субъективное мнение.
2) Логирование - очень частая задача. Если тебе чем-то не нравится ни одна либа логов, то у тебя выбор:
а) ты пишешь свою, выкладываешь в опенсорс, мы зацениваем и аплодируем (уже должен был написать, где она?)
б) ты не в курсе дел, продолжаешь есть кактус и не жалуешься
в) ты знаешь в чем косяки либ, но сам нифига не делаешь, - самый фиговый вариант, я так понимаю, что ты его выбрал?
1
45 / 21 / 6
Регистрация: 28.02.2013
Сообщений: 194
06.02.2016, 15:12  [ТС]
1. В данном конкретном примере возникло ТИПИЧНОЕ недопонимание.
2. Решение проблеммы оказалось СЛОЖНЕЕ чем без никаких одноразовых функций.
3. Дальнейшая разработка оказалась затруднена ЗАХЛАМЛЕНИЕМ соответствуюшего срр файла никому не нужными функциями, которые там ничем не отличаются от важных функций "бизнес-логики"

Тоесть мы пытались уйти от захламления внутри функции - и пришли к захламлению всего модуля (срр файла)
Функция отлажена, к ней у нас нет вопросв, но вот файл так и остался весь в хламе, который уже никому не нужен.
И чего мы этим добились?

Добавлено через 4 минуты
Цитата Сообщение от ct0r Посмотреть сообщение
Более того, нормальные люди вообще делают какой-нибудь ключ в бинарнике типа -d для вывода нужной отладочной инфы. И пофиг, собран дебаг то или релиз.
Вы мыслите категориями программы зравствуй мир.
У меня первая часть программы уже отлажена. и мне эта инфа не нужна.
А вторую я СЕЙЧАС отлаживаю. И первая часть расчётов вызывается 1000000 раз во второй части.
ключь -d для проги мне тут никак не поможет. мне ндо отключить логи для всех модулей где мне это СЕЙЧАС не надо, и включить где надо.

Добавлено через 2 минуты
На вопрос почему б мне не удалить вовсе логи если модуль отлажен...
Через год - я пишу похожую программу, и в ней использую этот модуль.
И ОПА... он работает неправильно... А тут опа... есть все логи.
Смысл надеюсь понятен. И всё это не от хорошей жизни придуманно, и не философия, а это конкретное решение конкретных проблемм было!
Ин реал Лайф!

Добавлено через 2 минуты
Я не гоняюсь за ошибками как умалишенный за зайцем в лесу, а методично и качественно стараюсь её локализовать. Такой подход обычно выявляет даже больше ошибок чем искалось. Временно некритичные всякие и тп. И логи очень!!!!! ОЧЕНЬ!!! в этом помагают.
Но это естественно не о хело ворд программах.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.02.2016, 16:00
Цитата Сообщение от nefton Посмотреть сообщение
Вы мыслите категориями программы зравствуй мир.
У тебя как раз именно хелловорлд. Впрочем такая очевидная штука, как -debug параметр известна уже давненько, и вовсю где только не используется (LLVM известный пример):
http://llvm.org/docs/Programme... bug-option
Often when working on your pass you will put a bunch of debugging printouts and other code into your pass. After you get it working, you want to remove it, but you may need it again in the future (to work out new bugs that you run across).
Так что читай и просветляйся.

Цитата Сообщение от nefton Посмотреть сообщение
А вторую я СЕЙЧАС отлаживаю. И первая часть расчётов вызывается 1000000 раз во второй части.
Молодец. Только вспомни еще, что существуют юнит-тесты.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.02.2016, 17:46
Цитата Сообщение от ct0r Посмотреть сообщение
Спасибо, кэп. Как это опровергает
это не опровержение, а уточнение дизайна использования.

дизайн интерфейса логгера - макросы.
это нужно, что бы была возможность полностью выпилить код из компиляции.

и если пользователь захочет логгировать каждый шаг некоторой процедуры,
значит он будет тыкать логгеры в каждом шаге этой процедуры.
Ваш Кэп.

Цитата Сообщение от ct0r Посмотреть сообщение
Если ты везде тыкаешь макросы, знать не зная узкие места
если нужно залоггировать критичный к быстродействию участок кода,
значит критичный к быстродействию участок кода будет залоггирован.

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

Цитата Сообщение от ct0r Посмотреть сообщение
из твоей фразы любое логирование оказывается просаживает! производительность, ужас, как с этим жить?
разумеется просаживает.
вопрос лишь в том, насколько это критично.

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

годные логгеры позволяют тредам писать одновременно,
не залипая, и не ожидая друг дружку.

Цитата Сообщение от ct0r Посмотреть сообщение
кто будет виноват в фигово написанном коде?
это что-то из серии:
"а почему лестницы без перил? "
"а вы не ходите по самому краю, и не упадете"

Цитата Сообщение от ct0r Посмотреть сообщение
нормальные люди вообще делают какой-нибудь ключ в бинарнике типа -d для вывода нужной отладочной инфы. И пофиг, собран дебаг то или релиз.
критично, что бы в случае, когда выводить ничего не нужно,
оно не просаживало бы рантайм холостыми вычислениями.

Цитата Сообщение от ct0r Посмотреть сообщение
ты пишешь свою, выкладываешь в опенсорс, мы зацениваем и аплодируем (уже должен был написать, где она?)
в разработке.

мой логгер ориентирован не только для ведение пользовательских логов,
но и для отладочных целей (пасет трассу вызов функций и тп).

одно из требований к нему:
в случае аварии он должен суметь выжить, и не потерять данные.

другое требование: кроссплатформа.

первоначальный вариант библиотеки использовал технику перехвата крашей на сигналах.

но как показала практика, нельзя 100% положиться на сигналы.
к тому же, в процедуре эвакуации данных была допущена ошибка,
связанная с нереентабельностью некоторых используемых операций.
в общем то, это годно работало, и неоднократно выручало,
но без гарантий.

я решил отказаться от этого пути в пользу отладочного процесса.
при запуске, рождается отдельный отладочный процесс.
которые принимает данные от целевого приложения.
и время от времени мониторит его состояние.

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

в общем, он у меня так и валяеццо в недоработанном состоянии.
---------------------------

есть ещё кое что, практика показала:
удобную вещь хочется использовать как можно чаще.
но тогда возникла новая проблема:
логи оказались очень жирными и толстыми.
искать в них что либо, как иголку в стоге сена.

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

но даже такие меры не смогли остановить сильное разбухание файлов-логов.

понадобилась годная читалка.
первая читалка была на html.
можно было тыкая на плюсики разворачивать/сворачивать фреймы стека функций и тд.

но этого оказалось не достаточно.

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

в общем, я пришел к выводу, что читалка логов должна работать с базой данных
и требуется годный интерфейс, что бы можно было легко просеивать записи,
и не долбаться со всякими регулярными выражениями.

и когда я это понял, тогда пришло понимание,
что настоящий годный лог - это серьёзная технология,
конструирование которой - серьёзная разработка,
и это - история не одного дня.

резюмируя:
для дешевого варианта - обычный макрос и std::cout
и нет смысла во всяких boost::log, они все равно толком не умеют.

годный лог - целая технология.
в свободном наличии я таких не знаю.

Цитата Сообщение от ct0r Посмотреть сообщение
ты знаешь в чем косяки либ, но сам нифига не делаешь, - самый фиговый вариант, я так понимаю, что ты его выбрал?
позвольте полюбопытствовать:
на чем основывается ваше понимание моей скромной персоны?
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
06.02.2016, 18:18
Цитата Сообщение от hoggy Посмотреть сообщение
позвольте полюбопытствовать:
на чем основывается ваше понимание моей скромной персоны?
На информации, имеющейся в тот момент. Если бы ты более подробно и менее категорично все расписал, то понимание было б другое.

hoggy, все наши утверждения выше по большому счету никак друг другу не противоречат. Но я хочу знать, что тебе не нравится, например тут https://github.com/gabime/spdlog

Цитата Сообщение от hoggy Посмотреть сообщение
и когда я это понял, тогда пришло понимание,
что настоящий годный лог - это серьёзная технология,
конструирование которой - серьёзная разработка,
и это - история не одного дня.
резюмируя:
для дешевого варианта - обычный макрос и std::cout
и нет смысла во всяких boost::log, они все равно толком не умеют.
годный лог - целая технология.
в свободном наличии я таких не знаю.
Ты про типа этого?
https://www.manning.com/books/... processing
https://engineering.linkedin.c... s-unifying
3
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.02.2016, 18:51
Цитата Сообщение от ct0r Посмотреть сообщение
Но я хочу знать, что тебе не нравится, например тут
смотреть нужно. этого зверька я раньше не видел.
я так понял, стратегии контроля за контентом у него не развиты.

Цитата Сообщение от ct0r Посмотреть сообщение
Ты про типа этого?
оу, спасибо за ссылки
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.02.2016, 18:51
Помогаю со студенческими работами здесь

#define
Здравствуйте, дорогие программисты! сразу хочу сказать, что в С++ я совсем недавно, поэтому толком ничего не знаю Во-первых,...

define
И еще такой вопрос для чего служит #define ??

#define c ::
Подскажите как реализовать такую замену: #define sa2::sys::getClientKernel()-&gt;getXDBTManager() cls_SimpleXDBTManager::Instance() ...

define не
Здравствуйте. &quot;Дефайню&quot; &quot;%f&quot; для вывода: #define fss &quot;%f&quot;; . И потом делаю вывод вот такой вот: for(i=0;i&lt;n;i++)...

define
Всем здрасьте , что означает эта строчка? #define MAX(a,b) a&gt;b? a:b


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
46
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru