Вывод отладочной информации в файл через API
Часто при написании серьёзных программ, в том-числе и вредоносных (Хе-Хе), возможность удобной отладки очень много значит и от этого зависит собственно скорость разработки софта и своевременность правок багов.
Можно отлаживать стандартным отладчиом IDE, например в Visual Studio отличный отладчик, можно использовать сторонние также, также иногда бывает полезно глянуть ассемблерный код, например если собирать в MSVC так cl 1.cpp /Fa1.asm то компилятор в 1.asm сгенерирует листинг на ассемблере (Ключ /Fa означает сгенерировать листинг на ассемблере).
Тем не менее лично я предпочитаю делать отладку в файл, либо printf в консоль.
Вообще отладка в файл предпочтительно по следующим причинам:
Во первых, лично мне нравится формат printf, этот оператор позволяет делать форматированный вывод (Т.е. вывод чисел в разных системах счисления, строк и т.д.).
Вот я и сделал, что-бы было тоже самое, но только в файл.
Для создания файла используются API винды.
Примеры:
Вывод строки:
DEBUG_TO_FILE("START TEST:\r\n");
Форматированный вывод числа:
DEBUG_TO_FILE("Hex_Value = %x Dec_Value = %d\r\n", value, value);
Вывод строки, через указатель
DEBUG_TO_FILE("Debug_Str = %s\r\n", str);
Всё оформлено в заголовочном файле debug_info.h достаточно подключить себе…
В репозитории есть пример:
Сам код debug_info.h получился такой:
Часто при написании серьёзных программ, в том-числе и вредоносных (Хе-Хе), возможность удобной отладки очень много значит и от этого зависит собственно скорость разработки софта и своевременность правок багов.
Можно отлаживать стандартным отладчиом IDE, например в Visual Studio отличный отладчик, можно использовать сторонние также, также иногда бывает полезно глянуть ассемблерный код, например если собирать в MSVC так cl 1.cpp /Fa1.asm то компилятор в 1.asm сгенерирует листинг на ассемблере (Ключ /Fa означает сгенерировать листинг на ассемблере).
Тем не менее лично я предпочитаю делать отладку в файл, либо printf в консоль.
Вообще отладка в файл предпочтительно по следующим причинам:
- Всегда её можно включить, если например у заказчика софта что-то отвалилось, при дебажном режиме будет лог.
- Часто нет возможности отладится стандартными средствами даже в процессе разработки.
- Текстовый лог, это удобно, вы сами можете контроллировать уровень детализации лога.
Во первых, лично мне нравится формат printf, этот оператор позволяет делать форматированный вывод (Т.е. вывод чисел в разных системах счисления, строк и т.д.).
Вот я и сделал, что-бы было тоже самое, но только в файл.
Для создания файла используются API винды.
Примеры:
Вывод строки:
DEBUG_TO_FILE("START TEST:\r\n");
Форматированный вывод числа:
DEBUG_TO_FILE("Hex_Value = %x Dec_Value = %d\r\n", value, value);
Вывод строки, через указатель
DEBUG_TO_FILE("Debug_Str = %s\r\n", str);
Всё оформлено в заголовочном файле debug_info.h достаточно подключить себе…
В репозитории есть пример:
Вы должны зарегистрироваться, чтобы увидеть внешние ссылки
Сам код debug_info.h получился такой:
C++:
#pragma once
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
#define DEBUG_INFO_SIZE 1*1024
#define NAME_LOG L"debug.txt"
static char debug_info[DEBUG_INFO_SIZE];
static void clear_log(void) {
DeleteFile(NAME_LOG);
}
static void debug_to_file(...) {
DWORD result = 0;
//Копирование строки в буфер
unsigned int size_string = strlen(debug_info) + 1;
//Запись строки в файл, если файл уже создан, то будет дописываться в конец файла новые строки.
HANDLE hFile = CreateFile(NAME_LOG, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hFile, 0, NULL, FILE_END);
WriteFile(hFile, debug_info, size_string, &result, NULL);
//Закрытие файла
CloseHandle(hFile);
}
#define DEBUG_TO_FILE(...) snprintf(debug_info, DEBUG_INFO_SIZE - 2, __VA_ARGS__); debug_to_file(__VA_ARGS__);
Последнее редактирование: