Удаление текста stati c из сообщений журнала и сохранение только переменных - PullRequest
0 голосов
/ 14 января 2020

Я знаю, что есть способ избавиться от текста c из сообщений журнала и сохранить в памяти только переменную часть сообщения. Но я не уверен, как именно это делается.

Чтобы привести конкретный пример к тому, что я имею в виду:

Вот код для клиента:

#include <stdio.h>
#include "my_logging.h"
int main() {
   MY_CUSTOM_LOGGING_TECHNIQUE("This is message %d", int, 1);
   MY_CUSTOM_LOGGING_TECHNIQUE("This is message %d", int, 2);
   return 0;
}

И что нужно сделать:

  1. Во время компиляции / сборки:

Создать XML файл во время компиляции / сборки, чтобы дать идентификатор для каждого сообщения:

<xml>

<message params=1>
<id>123456</id>
<text>This is message %d</text>
<param>int</param>
</message>

<message params=1>
<id>456342</id>
<text>This is message %d</text>
<param>int</param>
</message>

</xml>
Во время выполнения: только идентификатор сообщения хранится вместе со значениями параметров в соответствующей структуре (показана здесь как массив 'messages_array'): messages_array:

messages_array

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

Это сообщение 1
Это сообщение 2

Основная проблема, которую я пытаюсь решить, это "Отсутствие для записи текста c в файл во время выполнения. Вместо этого, только идентификатор сообщения и значение аргумента, отправленного в сообщении.

Итак, как я могу это сделать?

1 Ответ

0 голосов
/ 14 января 2020

Боюсь, что это невозможно с C без какой-либо дополнительной предварительной обработки / постобработки.

Одним из решений было бы использование макроса __COUNTER__ с комбинацией параметра -E g cc и постобработки это сгенерирует XML файл. Смотрите этот пример:

#define MY_LOG(string, ...) logPlaceholder(__COUNTER__, string); logFunction(__VA_ARGS__)

void logPlaceholder(int a, const char* str) {}

void logFunction(int param)
{
    printf("%d\n", param);
}

int main()
{
    MY_LOG("hello%d", 1);
    MY_LOG("world%d", 2);
    return 0;
}

Вы можете заменить logFunction на некоторую функцию variadi c, чтобы принять больше параметров.

logPlaceholder будет оптимизировано, так как это пустая функция - строка не будет присутствовать в выходном двоичном файле.

Он сгенерирует что-то подобное stdout при компиляции с параметром -E:

int main()
{
    logPlaceholder(0, "hello%d"); logFunction(1);
    logPlaceholder(1, "world%d"); logFunction(2);
    return 0;
}

Когда вы перенаправляете вывод g cc в файл, который можно постобработать - найдите строку logPlaceholder и сгенерируйте XML с номером сообщения, строкой и всеми аргументами.

Однако __COUNTER__ задается компилятором c (нестандартно) и является глобальным для всех макросов.

...