2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

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

26.01.2017, 20:57. Показов 3140. Ответов 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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
28.01.2017, 23:29
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
а почему у каждого клиента свой сервер?)
Потому что мы поставляем клиент-серверное приложение. Почему вас это смутило?
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.01.2017, 23:38  [ТС]
Цитата Сообщение от MrGluck Посмотреть сообщение
Почему вас это смутило?
Не встречал в своей практике приложение, что является сервером в том смысле в каком оно есть для многих. Как правило, это дата-центр с кучей компов, который арендует фирма. Но чтобы клиент установивший ваш софт называл свою комнату серверной? нет. Не встречал.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.01.2017, 10:55
Цитата Сообщение от sys_beginner Посмотреть сообщение
это как правило означает, что программист что-то упустил. А в случае с логами это как раз те участки, которые заранее известны (программист же руками не зря в этом участке ведет логирование). Как можно залогировать то, о чем программист просто не подозревает, как ты сам отметил "работает не так как было задумано". Если ошибка в самой программе, то логи об этом не скажут.
Я не соглашусь. Категорично.

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

NDSrv [I] registerDevice: status = OK.
NDSrv [I] createWorkerPool: numThreads = 8
NDSrv [I] createConnection: addr = 10.0.64.152, port = 80
NDSrv [I] delegateWork: thread = 1
NDSrv [I] thread(1): 973 bytes received, calling handler...
NDSrv [I] thread(1): 973 bytes received, calling handler...
NDSrv [I] thread(1): 973 bytes received, calling handler...
NDSrv [I] thread(1): 973 bytes received, calling handler...
NDSrv [I] thread(1): 973 bytes received, calling handler...
NDSrv [I] thread(1): 973 bytes received, calling handler...
NDSrv [I] thread(1): 973 bytes received, calling handler...
...

Здесь видно, что до вызова delegateWork все было в порядке, после чего обработчик потока
почему-то стал рекурсивно вызывать сам себя. Одинаковое количество принятых байт еще
больше усиливает подозрение. Логи нам не скажут, что кто-то забыл в полиморфный метод
хэндлера добавить ключевое слово virtual. Но они скажут, что надо открывать и смотреть код
delegateWork и функцию thread. Т.е., как минимум, логи здесь помогли очень сильно сузить
круг поисков.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
странный у вас софт если падает от названия домена и установленного антивируса) Прям вижу уже на обороте диска с игрой системные требование : "не устанавливайте AVAST и не используйте хостинга Trololo"
У нас очень сложный софт, который глубоко интегрируется в систему, местами почище антивирусов.
А у клиентов окружение иногда настолько нестандартное и заковыристое, что бывает всякое.
Иногда проблемы возникают из-за совершенно простых функций, которые до этого годами
использовались и никто не жаловался. Иногда приходится сталкиваться с багами в чужом софте, в
том числе в антивирусных продуктах, или даже в самой ОС.

Разрабатывать софт, который и в таких конфигурациях будет четко работать с железобетонной и
неумолимой логикой, довольно тяжело. "Цветастость" багов зашкаливает, можно книгу писать
4
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
29.01.2017, 11:06
Цитата Сообщение от sys_beginner Посмотреть сообщение
Для этого программное обеспечение должно уметь "отлавливать" ошибки
Ага, а настоящий программист должен писать без багов
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
29.01.2017, 12:19
Цитата Сообщение от Убежденный Посмотреть сообщение
Логи нам не скажут, что кто-то забыл в полиморфный метод
хэндлера добавить ключевое слово virtual.
Ага, это моя основная мысль.

Цитата Сообщение от Убежденный Посмотреть сообщение
Но они скажут, что надо открывать и смотреть код
delegateWork и функцию thread. Т.е., как минимум, логи здесьпомогли очень сильно сузить
круг поисков.
Да, именно такие моменты я называю "побочными эффектами", у меня тоже такое бывало, только в 9 из 10 случаев обычно я знал "вот тут мне нужен лог" потому что понимал могут быть проблемы в этом месте и нужно это отслеживать.
Поэтому называть логгер баг хантером ну уж никак язык не поворачивается...

Наверное кому что больше встречалось тот ту сторону и защищает

Цитата Сообщение от Voivoid Посмотреть сообщение
Ага, а настоящий программист должен писать без багов
)))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.01.2017, 12:42
Цитата Сообщение от sys_beginner Посмотреть сообщение
Почему бинарь отлаживать?
вы вообще когда нибудь имели дело с боевым проектом?

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

ну и что вы будете делать?

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

я просто почитаю логи,
и буду знать, что происходило.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Я имел ввиду, если есть подозрение на баг, берем сорцы и дебажим в дебаг режиме...
вы даже примерно не знаете, ни где искать, ни что искать.
потому что без логов вы не знаете,
что на самом деле происходило у клиента.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Речь шла именно о исправлении багов с помощью логгера(я выступал именно против этого).
именно для исправления ошибок логи и нужны.
что бы что-то исправить, нужно сначала понять:
что именно сломалось.

можно просто почитать текст логов.
а можно поиграть в телепата-нострадамуса.

Цитата Сообщение от sys_beginner Посмотреть сообщение
Да. Только не каждая ошибка это баг, так ведь?
к чему вообще вопрос?

Цитата Сообщение от sys_beginner Посмотреть сообщение
А баги это уже заботы дебагера, я об этом.
вы мне до сих пор не смогли объяснить,
как вы своим дебегером
будете отлаживать стрипованный релиз.

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

Цитата Сообщение от sys_beginner Посмотреть сообщение
Для этого "реальные пацаны", разработчики серверов обычно предоставляют соответствующий интерфейс общения для тех кто использует API, а не умирают молча (и не виснут в состоянии "???").
аха, и никогда не ошибаются.
и какают, наверное, вишенками.

Цитата Сообщение от sys_beginner Посмотреть сообщение
В таком случае логгер должен будет решать много задач что в сущности неверно.
он решает одну задачу - логгирует.

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

Цитата Сообщение от sys_beginner Посмотреть сообщение
Лучше просто в тех местах где логируются критические сбои вызвать ответственные компоненты по тем операциям которые нужно выполнить в случае возникновения проблемы.
Например
C++
1
2
3
4
5
if (criticalProblem) {
    Logger->log(WARN, "error message");
    Mailer->send("developer@gmail.com", Logger->getList()->toString());
    //other operations...
}
вы вообще себя слышите?
это сбой.
процесс уже умер.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.01.2017, 12:53
Цитата Сообщение от hoggy Посмотреть сообщение
к чему вообще вопрос?
Это был риторический вопрос. Он был к тому, что ошибка может произойти не по причине бага а из за проблем самой машины(например нет места на диске, программа не виновата).
Цитата Сообщение от hoggy Посмотреть сообщение
он просто запускает аварийный скрипт.
и как он запускает этот скрипт, если
Цитата Сообщение от hoggy Посмотреть сообщение
это сбой. процесс уже умер.
вы запускаете логгер как отдельный процесс следящий за основным?

Опять же. Там где есть логирование - это место программист залогировал сам ибо понимал что проблемы могут быть в этом месте.
Я же говорю о тех вещах где заранее неизвестно что может возникнуть проблема
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.01.2017, 13:43
Цитата Сообщение от sys_beginner Посмотреть сообщение
Он был к тому, что ошибка может произойти не по причине бага а из за проблем самой машины(например нет места на диске, программа не виновата
какая разница?

Цитата Сообщение от sys_beginner Посмотреть сообщение
вы запускаете логгер как отдельный процесс следящий за основным?
отдельный процесс на каждый тред.

основной процесс сообщает:
"тред номер 1, запускаю функцию foo"
сигнал получает сторожевик данного треда.

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

Цитата Сообщение от sys_beginner Посмотреть сообщение
Там где есть логирование - это место программист залогировал сам ибо понимал что проблемы могут быть в этом месте.
Я же говорю о тех вещах где заранее неизвестно что может возникнуть проблема
логгирование для того и нужно,
что бы выявлять вот эти заранее неизвестные места.
0
30.01.2017, 14:36

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
вы вообще себя слышите?
это сбой.
процесс уже умер.
окончание триллера, виновного в смерти процесса так и не нашли

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.01.2017, 14:36
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
49
Ответ Создать тему
Опции темы

Новые блоги и статьи
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru