Уровень лога условный? - PullRequest
0 голосов
/ 18 января 2019

Можно определять сообщения в коде, используя функции Glib, такие как debug (), которые регистрируются только когда уровень журнала установлен достаточно высоко, например, с помощью переменной среды G_MESSAGES_DEBUG.

Можно ли поместить код в условное выражение, которое запускается только с определенным уровнем журнала?

Например, я бы хотел, чтобы следующий код выполнялся только при включенной отладке:

foreach (var object in list) {
 debug ("    object: %s", object.id);
}

Ответы [ 3 ]

0 голосов
/ 19 января 2019

Если вы хотите добавить свой код в операторы отладки, вы можете проверить переменную среды:

void main () {
    if (Environment.get_variable ("G_DEBUG") == "fatal-criticals") {
        print ("Debug code\n");
    }
}

Опытный кодировщик предложил бы использовать отладчик для пошагового выполнения кода.Это означает, что вам не нужно добавлять дополнительные операторы только для отладки, но с Vala это немного сложно.Вот пример.Программа Vala:

void main () {
    var a = "before";
    var b = Test.run (a);
    print (@"$(b)\n");
}

namespace Test {
    string run (string a) {
        return "after";
    }
}

Компилировать с:

valac function_breakpoint_example.vala --debug -X -O0 --save-temps

--debug включает номера строк для кода Vala в сгенерированном C. -X -O0 передает -O0 вКомпилятор C, поэтому информация не оптимизирована.--save-temps сохраняет временные файлы C, сгенерированные Vala, чтобы отладчик мог ссылаться на них.

Теперь запустите отладчик gdb:

gdb ./function_breakpoint_example
...enters gdb...
break test_run
run
# Program runs and then stops when Test.run is entered
step
# or `cont` if you want to continue on to the end of the program

Вам необходимо понять, как Vala преобразует свой символимена для имен символов C.В этом примере используется пространство имен, поэтому Test.run преобразуется в функцию test_run в C. break test_run говорит GDB прекратить запуск программы при вызове этой функции.

Вы можете установить разрывуказать номер строки в исходном файле, например,

break function_breakpoint_example.vala:9

Существует целый ряд команд для получения дополнительной информации, например, трассировка полного стека или печать локальных переменных.info args покажет аргументы, переданные функции, p a покажет содержимое переменной a и info locals выведет локальные переменные.Некоторая напечатанная информация будет более понятной, чем другая информация.

Другой вариант, который снова добавляет операторы в ваш код, заключается в использовании директивы Vala pre-parser.Это останавливает Vala, пропуская код через весь процесс компиляции, если условие не установлено.Например:

void main () {

#if DEBUG
    print ("debugging...\n");
#endif

}

при компиляции с:

valac pre_parser_directive.vala -D DEBUG

включит оператор print в сгенерированный C. Без -D DEBUG эта часть кода Vala не будетбыть проанализирован и поэтому он не появляется в конечном выводе.

0 голосов
/ 20 января 2019

Официально рекомендуемый способ * сделать некоторый код зависящим от того, включен ли отладочный вывод, это проверить значение переменной окружения G_MESSAGES_DEBUG самостоятельно. Если его значение равно all или содержит интересующий вас домен, включите свой код.

Для этого нет вспомогательной функции - вы должны написать свою собственную.

* Я разработчик из основной ветки разработки.

0 голосов
/ 18 января 2019

Обработчик журнала по умолчанию использует некоторые env.vars G_MESSAGES_PREFIXED и G_MESSAGES_DEBUG.Вы используете g_log () или специализированную версию (g_error (), g_assert (), g_critical (), g_return_if_fail () и g_return_val_if_fail (), g_warning (), см. G_message (), g_debug ()) длясформулируйте сообщение.

...