您的位置 首页 > 数码极客

【错误正在打印怎么解决】Linux错误打印和消息打印

1打印错误和打印消息

在软件开发过程中,Linux内核开发、Linux应用程序开发或其他软件开发对错误处理至关重要。

在Linux应用程序开发中,我们一般使用errno变量来处理错误。类似的,内核中,也提供了几种错误处理,这几种错误处理基本涵盖了可能会遇到的所有错误。我们可以把他们打印出来用以帮助我们进行代码调试。

1.1 错误处理

没有对给定的错误返回错误码,会导致内核产生未知的行为。为了规范错误,内核中预定义了几乎涵盖了我们可能遇到的所有情况的错误。它们分别预定义在include/uapi/asm-generic和include/uapi/asm-generic中。以下摘自errno-ba中的内容(汉字注释是本人翻译,若有错误请见谅):

大多数情况下,经典的返回错误方式是 return -ERROR这种方式,特别是在响应系统调用时。例如,对于I/O错误,错误代码是EIO,应该返回:return -EIO。

当错误通过内核空间传递到用户空间时,如果返回的错误是由系统调用产生(open、read、write、ioctl等),则错误值将自动赋给用户空间的errno全局变量,然后使用strerror(errno)函数,就可以将错误码转换为可读的字符串。

我们在应用程序编程时,大部分公司的编码规范都会规定,不允许使用goto语句。但是在Linux内核中,goto使用非常广泛,因为当我们遇到错误时,必须撤销在这个错误发生之前的所有设置,此时使用goto语句是简单而高效的(goto语句在Linux内核中一般也只限于在错误处理中使用)。如下:

注意:在错误处理时注销、资源释放等,需要与正常的注册、资源申请顺序相反。

1.2 处理空指针错误

当函数的返回值是指针类型,调用该函数发生错误时,一般返回NULL指针。我们去检查为什么会返回空指针是没有意义的,因为我们无法准确地知道为什么会返回空指针。针对这种情况,内核提供了3个函数ERR_PTR、IS_ERR和PRT_ERR,这3个函数都是内联函数,定义在/include/linux中:

l void *ERR_PTR(long error);

该函数把错误值作为指针返回,实现代码如下:

l long IS_ERR(const void *ptr);

该函数用于检查返回值是否是指针错误,实现代码如下:

l long PTR_ERR(const void *ptr);

该函数返回实际错误码,实现代码如下:

下面举例说明上面3个函数使用方法:

1.3 消息打印

printk()是在内核空间使用的,其作用和在用户空间使用printf()一样。根据所打印消息的重要性不同,我们可以选用include/linux/ kern_levels.h中定义的消息日志级别。

对于新开发的驱动程序,建议使用以下宏,以下宏是对上面宏的封装:

l pr_emerg

l pr_alert

l pr_crit

l pr_err

l pr_warning

l pr_notice

l pr_info

l pr_debug

例:

pr_err(“something error\n”);

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐