C语言编写log文件以及printf函数实现原理
在系统调试中通过在文件系统里写log日志是一个长期分析系统运行的好方法。做系统调试应该养成这个习惯,可以方便的监控系统可能出现的各种异常。
今天学习下log日志的书写方法。Log一般可以分为以下4种:
ERROR(错误):此信息输出后,主体系统核心模块正常工作,需要修复才能正常工作。
WARN(警告) :此信息输出后,系统一般模块存在问题,不影响系统运行。
INFO(通知) :此信息输出后,主要是记录系统运行状态等关联信息。
DEBUG(调试):最细粒度的输出,除却上面各种情况后,你希望输出的相关信息,都可以在这里输出。
在多线程的程序中,可以按照以下的方式书写log:
这样在分析运行状况时就基本可以复现程序运行的流程了。
另外学习下printf函数实现的原理。C语言中printf函数的参数是可变的,是通过栈实现参数的传递。printf至少有一个参数,就是字符串指针,如果还有其他参数,比如
printf("a=%d b=%d",i,j); 会从右往左依次把参数压入栈内,先压j然后压i,然后压这个串"a=%d b=%d"的首地址也压入栈。在进行解析的时候是后入先出,按照%d去寻找后面的参
数。这样其实printf并不知道一共有几个参数,完全按照%d或者其他格式的类型去处理。这就有个问题就是要特别注意变量定义的类型一定要与格式控制符表示的格式一致,不一致会
出现读取错误.当然printf在转换参数时,对栈只读不写,不会造成栈错误。