• Уменьшение отступа

    Обратная связь

    (info@ru-sfera.pw)

На заметку Debug_info_for_windows


X-Shar

:)
Администрация
Регистрация
03.06.2012
Сообщения
6 068
Репутация
8 175
Вывод отладочной информации в файл через API

Часто при написании серьёзных программ, в том-числе и вредоносных (Хе-Хе), возможность удобной отладки очень много значит и от этого зависит собственно скорость разработки софта и своевременность правок багов.

Можно отлаживать стандартным отладчиом IDE, например в Visual Studio отличный отладчик, можно использовать сторонние также, также иногда бывает полезно глянуть ассемблерный код, например если собирать в MSVC так cl 1.cpp /Fa1.asm то компилятор в 1.asm сгенерирует листинг на ассемблере (Ключ /Fa означает сгенерировать листинг на ассемблере).

Тем не менее лично я предпочитаю делать отладку в файл, либо printf в консоль.

Вообще отладка в файл предпочтительно по следующим причинам:
  1. Всегда её можно включить, если например у заказчика софта что-то отвалилось, при дебажном режиме будет лог.
  2. Часто нет возможности отладится стандартными средствами даже в процессе разработки.
  3. Текстовый лог, это удобно, вы сами можете контроллировать уровень детализации лога.
Вообще делать можно по разному, но решил поделится своей наработкой:

Во первых, лично мне нравится формат 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__);
 
Последнее редактирование:
Верх Низ