1 Востаннє редагувалося Дмитро-Чебурашка (13.08.2019 19:43:17)

Тема: Які існують методи відладки дебаг коду і взагалі?

Які існують методи відладки, що б слати повідомлення, може бути навіть, з кожної функції?
Ось наприклад створюю гру на SDL в codeblocks, обто консоль відсутня, яки в C++ існують методи слати з коду
сповіщення, ну тобто ви зрозуміли. Краще на прикладах.
Далі, (власне інша справа), Selecting target:
Debug
ERROR: You need to specify a debugger program in the debuggers's settings.
(For MinGW compilers, it's 'gdb.exe' (without the quotes))
(For MSVC compilers, it's 'cdb.exe' (without the quotes))
Мабуть, таки і немає, як би поставити і налагодити, чи що? Но це вже друга справа,
питання скоріше стосуться плюсового коду, вивертів та можливостей його.

Тобто те що я спробував так би мовити в лоб не діє можливо з багатьох причін

#ifdef NDEBUG
             std::cout << "Csoldat::Csoldat()" << std::endl;
             #else
             std::cout << "noNDEBUG Csoldat::Csoldat()" << std::endl;
  #endif // NDEBUG

2

Re: Які існують методи відладки дебаг коду і взагалі?

є така утиліта Русіновича Debug view, там написано що використовують на рівні ядра, а на рівні користувача використовують OutputDebugString

3 Востаннє редагувалося wander (13.08.2019 21:28:08)

Re: Які існують методи відладки дебаг коду і взагалі?

Вам ж прямим текстом написали: "виберіть дебагер". У вас є два: один студійний, другий - MinGWешний, засетайте в налаштуваннях тай все. А взагалі, що спонукає користуватися кодблоксом? 0_о

Подякували: leofun01, 221VOLT2

Re: Які існують методи відладки дебаг коду і взагалі?

Нема жодного, ну так, я щось скачаю, поставлю...  Так буде найкраще.

5 Востаннє редагувалося Torbins (14.08.2019 13:08:37)

Re: Які існують методи відладки дебаг коду і взагалі?

Не уявляю собі, як можна щось дебажити без дебагера. Це якесь марнування часу просто. Бувають звичайно випадки, коли аплікація працює уже на продакшені або в кінцевого користувача, і коли трапляється якась помилка, то доступні лише логи чи аварійні дампи. Але це не так часто. Бо навіть у такому випадку можна підключитися налагоджувачем по мережі. А якщо не можна, то усе одно треба спочатку відтворити помилку у тестовому середовищі. Коротше кажучи, професійний програміст 90% часу має займатися зневадженням саме з дебагером.

6

Re: Які існують методи відладки дебаг коду і взагалі?

Torbins написав:

Не уявляю собі, як можна щось дебажити без дебагера. Це якесь марнування часу просто. Бувають звичайно випадки, коли аплікація працює уже на продакшені або в кінцевого користувача, і коли трапляється якась помилка, то доступні лише логи чи аварійні дампи. Але це не так часто. Бо навіть у такому випадку можна підключитися налагоджувачем по мережі. А якщо не можна, то усе одно треба спочатку відтворити помилку у тестовому середовищі. Коротше кажучи, професійний програміст 90% часу має займатися зневадженням саме з дебагером.

Як ви збираєтесь дебажити помилку яка виникае тільки на релізи? Наприклад? Так, можна використати системні дебагери - але насправді це займає не мало часу.
Дмитро-Чебурашка
Я використовую класс-логер - щось на кшалт:

//.h
enum LoggerLevel {
        LOGGER_INFO,
        LOGGER_WARNING,
        LOGGER_ERROR
    };

    class LoggerEntry {
    public:
        // overriden default constructor
        LoggerEntry() = default;

        int countMessages(const std::string& message);

        // levels
        std::vector<LoggerLevel> logLevels;

        // statuses
        std::vector<std::string> statuses;

        // time stamps
        std::vector<std::string> timeStamps;

        //measure performance
        std::unordered_multimap<std::string, double> measures;
        std::set<std::string> namefunctions;
        std::stack<std::string> callstack;
    };

    class Logger 
    {
        
    public:
        static std::unique_ptr<LoggerEntry> log;
        
        static void createEntryLog(const LoggerLevel& logLevel, const std::string& status);
        static void write(const std::string& filename);
    private:
        static std::mutex mutex;
    };

    struct PerfMeasure
    {    
        PerfMeasure(const std::string&);
        ~PerfMeasure();
        std::chrono::time_point<std::chrono::high_resolution_clock> start;
        std::string m_name;
        static std::mutex mutex;
        static int level;
    };

#ifdef LIB_FILE_LOGGER
#define IFCPP_LOG_INFO(str) Logger::createEntryLog(LOGGER_INFO, str);
#define IFCPP_LOG_WARNING(str) Logger::createEntryLog(LOGGER_WARNING, str);
#define IFCPP_LOG_ERROR(str) Logger::createEntryLog(LOGGER_ERROR, str);
#define IFCPP_LOG_MEASURE(str) PerfMeasure perf(str)
#else
#define IFCPP_LOG_INFO(str)
#define IFCPP_LOG_WARNING(str)
#define IFCPP_LOG_ERROR(str)
#define IFCPP_LOG_MEAGURE(str)
#endif

Для логу наприклад:

IFCPP_LOG_WARNING("Failed to triangulate shape");

Можна також шаблонізувати - якщо потрібно більш гнучка поведінка.
Якщо треба поміряти скільки часу виконується функцію:

IFCPP_LOG_MEASURE(__FUNCTION__);