日志级别是有条件的吗?

时间:2019-01-18 19:48:44

标签: glib vala

一个人可以使用debug ()之类的Glib函数在代码中定义消息,仅在将日志级别设置得足够高时(例如,使用G_MESSAGES_DEBUG环境变量)才记录消息。

是否还可以将代码置于仅在特定日志级别触发的某种条件下?

例如,我希望仅在启用调试时执行以下代码:

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

3 个答案:

答案 0 :(得分:0)

The default log handler uses some env. vars G_MESSAGES_PREFIXED和G_MESSAGES_DEBUG。您可以使用g_log()或specialized version(g_error(),g_assert(),g_critical(),g_return_if_fail()和g_return_val_if_fail(),g_warning(),请参阅g_message(),g_debug()来声明消息

答案 1 :(得分:0)

如果您希望使用调试语句添加代码,则可以检查环境变量:

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在生成的C语言中包含Vala代码的行号。-X -O0-O0传递给C编译器,因此信息无法得到优化。 --save-temps保留Vala生成的临时C文件,以便调试器可以引用它们。

现在运行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被转换为C语言中的test_run函数。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

将在生成的C中包含print语句。如果没有-D DEBUG,则不会分析部分Vala代码,因此它不会出现在最终输出中。

答案 2 :(得分:0)

使某些代码取决于是否启用调试输出的官方推荐方法*是自己检查G_MESSAGES_DEBUG环境变量的值。如果其值为all,或者包含您感兴趣的域,请启用您的代码。

没有辅助功能-您应该编写自己的帮助。

*我是上游开发人员。