一个人可以使用debug ()
之类的Glib函数在代码中定义消息,仅在将日志级别设置得足够高时(例如,使用G_MESSAGES_DEBUG
环境变量)才记录消息。
是否还可以将代码置于仅在特定日志级别触发的某种条件下?
例如,我希望仅在启用调试时执行以下代码:
foreach (var object in list) {
debug (" object: %s", object.id);
}
答案 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
,或者包含您感兴趣的域,请启用您的代码。
没有辅助功能-您应该编写自己的帮助。
*我是上游开发人员。