Glib学习(13) 警告和断言 Warnings and Assertions

时间:2021-08-10 23:55:52

glib源码下载:http://ftp.gnome.org/pub/gnome/sources/glib/
glib帮助文档:https://developer.gnome.org/glib/
首先将翻译贴上

g_print ()

通过打印处理程序输出格式化的消息。 默认的打印处理程序只是将消息输出到stdout,而不添加尾随的换行符。 通常,格式应该以自己的换行符结束。
g_print()不应该从库中用于调试消息,因为它可能被应用程序重定向到特殊目的消息窗口甚至文件。 相反,库应该使用g_log(),g_log_structured()或方便宏g_message(),g_warning()和g_error()。

参数
format
消息格式。 请参阅printf()文档
...
要插入格式字符串的参数

g_set_print_handler ()

设置打印处理程序。
传递给g_print()的消息将通过新的处理程序输出。 默认处理程序只是输出消息到标准输出。 通过提供您自己的处理程序,您可以将输出重定向到GTK +窗口小部件或日志文件。

参数
FUNC
新的打印处理程序
 
返回
旧的打印处理程序

GPrintFunc ()

指定打印处理函数的类型。 这些被调用完整的格式化字符串输出。

参数
string
要输出的消息

g_printerr ()类似g_print ()

g_set_printerr_handler ()类似g_set_print_handler ()


g_return_if_fail()

验证表达式expr(通常表示前提条件)的值为TRUE。 如果该函数返回一个值,请改用g_return_val_if_fail()。
如果expr的计算结果为FALSE,那么当前函数应该被认为具有未定义的行为(程序员错误)。 解决这个错误的唯一正确方法是更改正在调用当前函数的模块,以避免这种不正确的调用。
为了使这个未定义的行为可见,如果expr计算结果为FALSE,结果通常是关键的消息被记录并且当前函数返回。
如果定义了G_DISABLE_CHECKS,则不执行检查。 因此,您不应该依赖expr的任何副作用。
要调试g_return_if_fail()检查失败,请使用环境中定义的G_DEBUG = fatal-criticals或G_DEBUG = fatal-warnings在调试器下运行代码(请参阅运行GLib应用程序):
G_DEBUG=fatal-warnings gdb ./my-program
可以使用continue命令在gdb中跳过任何不相关的故障。

参数
expr
要检查的表达式

g_return_val_if_fail()

验证表达式expr(通常表示前提条件)的值为TRUE。 如果函数没有返回值,请改用g_return_if_fail()。
如果expr的计算结果为FALSE,那么当前函数应该被认为具有未定义的行为(程序员错误)。 解决这个错误的唯一正确方法是更改正在调用当前函数的模块,以避免这种不正确的调用。
为了使这个未定义的行为可见,如果expr的计算结果为FALSE,结果通常是记录一条关键的消息,并从当前函数返回val。
如果定义了G_DISABLE_CHECKS,则不执行检查。 因此,您不应该依赖expr的任何副作用。
有关如何调试此检查失败的指导,请参阅g_return_if_fail()。

参数
expr
要检查的表达式
val
如果表达式不是true,则返回当前函数的值

g_return_if_reached ()

记录关键信息并从当前函数返回。 这只能用于不返回值的函数。
有关如何调试此检查失败的指导,请参阅g_return_if_fail()。

g_return_val_if_reached()

记录重要消息并返回val。
有关如何调试此检查失败的指导,请参阅g_return_if_fail()。

参数
val
从当前函数返回的值

g_warn_if_fail()

如果表达式不正确,则记录警告。

参数
expr
要检查的表达式
从:2.16

g_warn_if_reached ()

记录警告。
从:2.16

g_on_error_query ()

用[E] xit,[H] alt,show [S] tack trace或[P] roceed提示用户。 此功能仅用于调试使用。 下面的例子展示了它如何与g_log()函数一起使用。
#include <glib.h>static void
log_handler (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
gpointer user_data)
{
g_log_default_handler (log_domain, log_level, message, user_data);


g_on_error_query (MY_PROGRAM_NAME);
}


int
main (int argc, char *argv[])
{
g_log_set_handler (MY_LOG_DOMAIN,
G_LOG_LEVEL_WARNING |
G_LOG_LEVEL_ERROR |
G_LOG_LEVEL_CRITICAL,
log_handler,
NULL);
...
如果选择“[E] xit”,则应用程序将终止并调用_exit(0)。
如果选择“[S] tack trace”,则调用g_on_error_stack_trace()。 这将调用gdb,该gdb附加到当前进程并显示堆栈跟踪。 该提示然后再次显示。
如果选择“[P] roceed”,则函数返回。
此功能可能会在非UNIX平台上导致不同的操作。

参数
prg_name
程序名称,gdb为“[S]追踪”选项所需。 如果prg_name为NULL,则调用g_get_prgname()以获取程序名(如果已调用gdk_init()或gtk_init(),则程序名将正确运行)

g_on_error_stack_trace ()

调用gdb,它附加到当前进程并显示堆栈跟踪。 当选择“[S]追踪”选项时,由g_on_error_query()调用。 您可以使用g_get_prgname()来获取当前进程的程序名,假设您调用了gtk_init()或gdk_init()。
此功能可能会在非UNIX平台上导致不同的操作。

参数
prg_name
程序名称,gdb为“[S]追踪”选项所需

G_BREAKPOINT()

在代码中插入一个断点指令。
在x86和alpha系统上,这是作为一个软中断来实现的,而在其他的体系结构中,它会产生一个SIGTRAP信号。


下面给出一个例程,因为能力有限,有些函数没有完全掌握用法,所以没有提供例子

有些函数是需要glib结构才能有效

#include <glib.h>
#include <glib/gprintf.h>

#include <glib/gstdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>

void gprint_func (const gchar *string)
{
gint fd = g_open ("warnasser.txt", O_RDWR|O_APPEND, 0666);
write(fd, string, strlen (string));
g_close (fd, NULL);
}

void return_if_fail(gboolean expr)
{
g_return_if_fail(expr);
g_printf ("g_return_if_fail is true\n");
}

gint32 return_val_if_fail(gboolean expr)
{
g_return_val_if_fail(expr, 22);
g_printf ("g_return_val_if_fail is true\n");
return 11;
}

void return_if_reached()
{
g_return_if_reached ();
}

gint32 return_val_if_reached()
{
g_return_val_if_reached (33);
}

int main(int argc, char **argv)
{
g_printf ("main in\n");

g_set_print_handler (gprint_func);
g_print ("g_print %d %s\n", __LINE__, "line");

g_printerr ("g_printerr %d %s\n", __LINE__, "line");

return_if_fail(FALSE);

g_printf ("return_val_if_fail() return %d\n", return_val_if_fail(FALSE));

return_if_reached();

g_printf ("return_val_if_reached() return %d\n", return_val_if_reached());

//为实现,暂时搁置
//g_set_prgname ("gwarn");
//G_BREAKPOINT();
//g_on_error_query (g_get_prgname ());

g_printf ("main out\n");
return 0;
}