Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Пустые дебаг методы vs полное выпиливание с проекта

26.01.2017, 20:57. Показов 2951. Ответов 48
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <string>
using namespace std;
 
//////////////////////////////////////////////////////////////////////////
class Log1
{
public:
    static void log(const std::string&)
    {
#if !defined(PRODUCTION)
        // ...
#endif
    }
};
 
//////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////////////////////
class Log2
{
#if !defined(PRODUCTION)
public:
    static void log(const std::string&)
    {
    
    }
 
#endif
};
 
#if !defined(PRODUCTION)
#define LOG(str) Log2::log(str)
#else
#define LOG(str)
#endif
 
//////////////////////////////////////////////////////////////////////////
 
int main()
{
    Log1::log("123213");
    LOG("123123123");
}
Подскажите, какой способ лучше применять для вещей которые не должны попасть в продакшен, и разбросаны по всему коду?

Моё мнение:
если макрос - то особо не поиграться с шаблонами и отсутствие статического проверки типа
если методы пустышки - то будет ли создаваться под них стек и вызов, или компилятор с оптимизирует всё это дело?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2017, 20:57
Ответы с готовыми решениями:

Полное имя файла из проекта
Как его получить?

Пустые методы в перечислении java.util.concurrent.TimeUnit
Решил, ради интереса, посмотреть, как реализованы методы convert(), toNanos(), toSeconds() и прочие в перечислении TimeUnit, но, к своему...

Выпиливание экземпляра класса самим собой
Наслышан и начитан о плохом тоне и ub команды delete this, однако, будет ли ошибкой вызывать вместо delete this деструктор? class...

48
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
26.01.2017, 21:36
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
если методы пустышки - то будет ли создаваться под них стек и вызов, или компилятор с оптимизирует всё это дело?
Если тело пустышки вынесено в отдельный cpp файл, возможно, возникнут проблемы с раздельной компиляцией (компилятору из соседнего cpp не видно что это пустышка и он на всякий пожарный ставит ее вызов). Если тело в .h файле, проблем быть не должно.
1
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
26.01.2017, 21:55
Лично мне больше нравится подход Log1: проверки типов остаются, функции и методы никуда
не исчезают и можно особо не волноваться на счет случайных побочных эффектов, которые
после таких удалений вдруг могли бы возникнуть. Перфоманс если и страдает, то очень
незначительно. В большинстве случаев компилятор будет просто выбрасывать пустые вызовы.
На счет вызова функций из других единиц трансляции - здесь тоже есть возможность
оптимизации, например MS C/C++ Compiler такое умеет делать и делает достаточно давно.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
26.01.2017, 22:43
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
LOG("123123123");
выпиливать нужно именно что передачу данных.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
26.01.2017, 22:45  [ТС]
hoggy, не пойму о чём вы)
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.01.2017, 05:44
ИМХО, что как-нибудь так лучше смотрелось бы:
LOG(DBG) << "open file";
LOG(ERR) << "can't open file";
LOG(WRN) << "empty data";
И т.д.
Возможно, что об этом и говорит господин hoggy, но это не точно!
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.01.2017, 10:04
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Подскажите, какой способ лучше применять для вещей которые не должны попасть в продакшен, и разбросаны по всему коду?
Программный код по сути это просто строки.
Можно написать программу которая просто перед продакшеном пройдется по всем файлам проекта,
откроет эти файлы и сделает replace вызовы log на пустую строку
и не придется уродовать код #if !defined(PRODUCTION) - ами

при сложных записях можно воспользоваться регулярными выражениями
либо тупо копипастить себе куда нибудь в файлик эти сложные записи и реплейсить их когда придет время
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.01.2017, 11:03
Цитата Сообщение от GbaLog- Посмотреть сообщение
LOG(DBG) << "open file";
LOG(ERR) << "can't open file";
LOG(WRN) << "empty data";
И т.д.
Возможно, что об этом и говорит господин hoggy
нет. в коде это смотрится красиво.
однако в режиме выключенных логов,
у вас тут получится передача данных в методы-пустышки.
что в общем то не бесплатно и совершенно напрасно.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
не пойму о чём вы
вот как работает ассерт?

C++
1
2
// heavy_long_test - дорогостоящая проверка
assert( heavy_long_test() && "data inconsistency detected");
в дебаге мы можем позволить себе выполнять
даже очень затратные проверки и не бояться за производительность.
ведь в релизе все что под ассертом будет выпилено из компиляции.

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

C++
1
2
3
// макрос полностью схлопнется в пустоту
// никаких затрат на подготовку текста
LOG(INFO, "hello, {1}, and {2}", "rikimaru2013", "GbaLog-");
дело в том, что на практике,
зачастую ещё нужно сформировать логируемый текст
на основе исходных данных:

C++
1
LOG(INFO,  report(src) );
где report может оказаться весьма дорогостоящей функцией,
которая будет дергать кучу всяких геттеров,
запрашивать исходные данные,
переводить числа в строки и тд,

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

а так - макрос схлопнулся, и никаких затрат.
4
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.01.2017, 11:39
Вообще, то чем вы сейчас занимаетесь нужно делать с помощью Unit тестов. И проблем таких не будет.
И профит от наличия тоестов будет большой, если программуля серьезная.
Логи как раз таки больше нужны в продакшене а не в девелопменте

Добавлено через 8 минут
Цитата Сообщение от hoggy Посмотреть сообщение
а так - макрос схлопнулся, и никаких затрат.
Не понятно, что означает "макрос схлопнулся" и что приводит к его схлопыванию
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.01.2017, 11:50
Цитата Сообщение от sys_beginner Посмотреть сообщение
Логи как раз таки больше нужны в продакшене а не в девелопменте
логи логам рознь
Цитата Сообщение от sys_beginner Посмотреть сообщение
Не понятно, что означает "макрос схлопнулся" и что приводит к его схлопыванию
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
#if !defined(PRODUCTION)
#define LOG(str) Log2::log(str)
#else
#define LOG(str)
#endif
если не объявлен PRODUCTION
все что в скобочках макроса превратится в пустоту
(не войдёт в компиляцию)
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.01.2017, 11:55
Цитата Сообщение от hoggy Посмотреть сообщение
все что в скобочках макроса превратится в пустоту
ааа... вот о чем речь... ну да. это вроде называется условная компиляция

Цитата Сообщение от hoggy Посмотреть сообщение
логи логам рознь
Например? Чем логи в девелопмене лучше тех же юнит тестов которые после их написания ещё и оставляют пользу
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.01.2017, 12:20  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
если не объявлен PRODUCTION
все что в скобочках макроса превратится в пустоту
(не войдёт в компиляцию)
Думаю вопрос был почему не вызовутся методы, что образуют str для аргумента макроса LOG(str)

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <string>
using namespace std;
 
#define PRODUCTION
 
void fn( const std::string& s )
{
    cout << s << endl;
}
 
const std::string compact( const std::string& s )
{
    cout << "compact " << s << endl;
    return s;
}
 
#if !defined(PRODUCTION)
#define LOG(str)  fn(str)
#else
#define LOG(str)
#endif
 
 
int main()
{
    const std::string msg = "hello";
    LOG( compact( msg ) );
}
Я об этом - какой пункт стандарта или чего либо гарантирует не вызов compact
0
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
27.01.2017, 12:39
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
гарантирует не вызов compact
А ни какого вызова и не будет, после препроцессирования получим в main:
C++
1
2
3
4
5
int main()
{
    const std::string msg = "hello";
    ;
}
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.01.2017, 12:46
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я об этом - какой пункт стандарта или чего либо гарантирует не вызов compact
Препроцессорные директивы отрабатывают до компиляции (этому есть подтверждение в стандарте, но лень искать). Поэтому на момент компиляции у вас вызовы с LOG будут заменены на пустое место.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.01.2017, 12:57
Цитата Сообщение от sys_beginner Посмотреть сообщение
Например?
я не зря привел аналогию с ассертами.
область применения дебажных логов такая же,
как и у обычных ассертов.
\
Цитата Сообщение от sys_beginner Посмотреть сообщение
Чем логи в девелопмене лучше тех же юнит тестов которые после их написания ещё и оставляют пользу
чем шариковая ручка лучше воздушного шарика?

Добавлено через 57 секунд
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я об этом - какой пункт стандарта или чего либо гарантирует не вызов compact
вот эту штуку закомментируйте:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
#define PRODUCTION
гарантии даёт препроцессор
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.01.2017, 13:33
Цитата Сообщение от hoggy Посмотреть сообщение
чем шариковая ручка лучше воздушного шарика?
Намек понял, но все же не согласен...

По сути лог это сохранение определенного действия для дальнейшего его анализа (например, не удалось занять порт на определенной машине просто потому что его занял кто-то другой).
На машине девелопмента такая информация не очень полезна. Я об этом, логи решают приблизительно такие задачи.
Что касается отладки, то для этого придумали отладчик

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

Добавлено через 9 минут
Цитата Сообщение от sys_beginner Посмотреть сообщение
На машине девелопмента такая информация не очень полезна.
В том смысле, что это должно быть в продакшене, что бы пользователь программы мог сразу понять в чем дело и почему не запускается программа.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.01.2017, 14:06
Цитата Сообщение от sys_beginner Посмотреть сообщение
На машине девелопмента такая информация не очень полезна.
С чего это вдруг?

Добавлено через 1 минуту
Цитата Сообщение от sys_beginner Посмотреть сообщение
В том смысле, что это должно быть в продакшене, что бы пользователь программы мог сразу понять в чем дело и почему не запускается программа.
Логи нужны больше программистам для выявления причин возникновения багов, нежели пользователям. Последним нужно лишь показать окно с инструкцией что делать (если ошибка не критична, то желательно вообще ситуацию исправить, не уведомляя пользователя.) А ошибку в лог записать.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
27.01.2017, 14:13
Цитата Сообщение от MrGluck Посмотреть сообщение
Логи нужны больше программистам для выявления багов, нежели пользователям.
Почему вы приравниваете логи к отладке? Логи как правило не связываются с багами. Это своего рода слежка за состоянием системы и иногда некоторая техническая информация которая может быть полезна конечному пользователю (возьмем тот же пример с занятым портом).

А баг означает что в программе есть кривизна. Тут уже нужны прямые руки и хороший отладчик, и не помешает автоматизация проверок на баги, что и было предложено в качестве юнит тестов...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
27.01.2017, 14:49
Цитата Сообщение от sys_beginner Посмотреть сообщение
Почему вы приравниваете логи к отладке?
Потому что чаще всего они нужны именно для неё.
Да, логи, в первую очередь, отражают состояние системы. Но не всегда пользователя интересуют подобные сведения. А вот для отладки они всегда могут быть полезны.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
27.01.2017, 15:41  [ТС]
Цитата Сообщение от sys_beginner Посмотреть сообщение
Логи как правило не связываются с багами
Расскажите про ваш опыт?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.01.2017, 15:41
Помогаю со студенческими работами здесь

Посоветуйте методы раскрутки для белого проекта
Занимаюсь сейчас планированием (в том числе бюджета) продвижения белого проекта для рунета (автомобильная тематика). Сайт с UG контентом +...

Дисковод не читает пустые dvd-r/rw и пустые cd-rw диски.
Дисковод не читает пустые dvd r/rw и пустые cd rw диски. Прибор для чтения - выдвинутый (кристаллик находится снаружи). Тип дисковода -...

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

Дебаг процедуры
Всем привет! Захотелось дебажить процедуру. Столкнулся с проблемами. С одной стороны в PL/SQL Developer есть функционал под дебаг. С...

Дебаг в Chrome
Пытаюсь выполнить console.log(); и выдаёт вот что. Как сделать так, что бы выводило в столбик, а не один рядок вывело и остановилось, а...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru