分类: 嵌入式
2011-07-25 21:58:27
日志伴随着出错而来,虽然C语言提供了一些方法,来检测错误,但是完善的日志系统是更好的选择。
C语言的出错机制 assert宏#include
void assert(int expression);
说明:
如果表达式为假,那么向stderr打印出错信息,然后调用abort终止程序运行。
缺点:
频繁的调用会大大的降低执行速度。所以最好只在开发阶段使用。在assert.h文件中有NDEBUG变量来判断。所以,
#define NDEBUG
#include
这样的话,就不会调用assert宏了。也可以在Makefile中定义NDEBUG。
注意,不要在assert宏的表达式中包含执行函数,这样的话,有可能被忽略掉。
c标准还定义了2个宏,__FILE__, __LINE__, 配合assert宏来更好的打印信息。
GNU C扩展标准定义了1个宏,__FUNCTION__。
标准库函数用来处理任何出错的C环境。
void abort(void); | stdlib.h | 异常终止,不处理现场 |
void exit(int status); | stdlib.h | 处理清理工作然后退出 |
int atexit(void (*fcn)(void)); | stdlib.h | 登记exit的时候,触发 |
void perror(const char *s); | stdio.h | 打印字符串外加errno的文本字符串 |
char *strerror(int errnum); | string.h | 打印errno的文本字符串 |
int errno; | errno.h | 全局变量,错误值 |
void clearerror(FILE *stream); | stdio.h | 清除EOF和其他出错标志 |
int feof(FILE *stream); | stdio.h | 是否有EOF标志 |
int ferror(FILE *stream); | stdio.h | 是否有出错标志 |
使用系统日志
Linux有两个守护进程提供系统日志功能,klogd, syslogd。(klogd = kernel log daemon)
系统日志位于/var/log目录下,配置文件为/etc/syslog.conf。
Ubuntu 桌面版没有syslogd 功能,需要install.
String _methodName = new Exception().getStackTrace()[1].getMethodName();// 获得调用者的方法名
String _thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名