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

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;
}

说一下g_on_error_query()函数的用法,要使用这个函数需要编译调试模式,即增加“-g”编译选项,并使用gdb运行,

运行到这个函数后gdb会提示需要的操作

“(process:21576): [E]xit, [H]alt or [P]roceed:”

根据选择执行不同动作。

在正常输出中还有一个“show [S]tack trace”,但是我的没有,是因为需要添加参数,参数就是程序名字“g_get_prgname()”,能够正常使用这个接口的前提是需要调用gdk_init() or gtk_init(),但是我的程序中没有,所以无法使用这个选项。

当然你也可以自己写入一个名字,如:g_on_error_query ("test");,这样就会出现s选项

test (pid:21635): [E]xit, [H]alt, show [S]tack trace or [P]roceed: 

你也可以使用g_set_prgname ()函数设置名字,这样就可以直接调用参数为NULL的g_on_error_query函数了。

g_set_prgname ("gwarn");

gwarn (pid:21663): [E]xit, [H]alt, show [S]tack trace or [P]roceed:

 

G_BREAKPOINT();这个函数在linux中调用相当于发送SIGTRAP信号,在gdb中会打印出

Program received signal SIGTRAP, Trace/breakpoint trap.
main (argc=1, argv=0x7fffffffdd98) at gwarnasser.c:67
67        g_printf ("main out\n");
表示此时收到一个信号。

如果没有gdb运行将会直接崩溃

追踪与中断点陷阱 (核心已转储)
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值