Chinaunix首页 | 论坛 | 博客
  • 博客访问: 142163
  • 博文数量: 40
  • 博客积分: 1131
  • 博客等级: 少尉
  • 技术积分: 459
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-16 11:50
文章分类
文章存档

2012年(2)

2011年(38)

我的朋友

分类: 嵌入式

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.

自定义log系统 在java中打印当前行

String _methodName = new Exception().getStackTrace()[1].getMethodName();// 获得调用者的方法名

String _thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名

阅读(1105) | 评论(0) | 转发(0) |
0

上一篇:GDB – XXGDB 调试

下一篇:GCC

给主人留下些什么吧!~~