Если вы хотите добавить свой код в операторы отладки, вы можете проверить переменную среды:
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 не будетбыть проанализирован и поэтому он не появляется в конечном выводе.