做过开发的人基本都知道, 日志对于开发和调试的意义非常重大, 一旦出现异常, 就需要依靠日志中信息来定位bug. 前面, 我们已经比较过单步调试和日志调试, 并详细讨论了彼此的优缺点。 总的来说, 日志调试的地位更加重要。本文我们只讨论日志调试, 且假设某产品打印日志的函数为logPrint.
logPrint看起来好用, 但是,在实际代码调试中, 我们经常会遇到如下三个稍微有点棘手的问题:
一. 某系统开机时, 用logPrint打印的那一行早就执行了, 我们来不及执行logcat进行输出, 也就是说, 无法看到开机过程中的日志。
二. 在某些场景下, 某个文件中, logPrint函数可能会莫名其妙地失效(很可能是该文件就不能用logPrint), 本来走到了对应的分支, 但是没有对应的日志打印, 非常容易误导程序猿的判断。 我也曾经说过, 有了日志的打印, 表明程序一定走到了对应的地方,但是, 没有日志的打印, 则不一定表明程序没有走到这个地方, 因为很可能是打印日志的函数logPrint失效。 我曾经吃过亏啊, 当时纳闷良久, 满头大汗。
三. 调试日志模块本身的时候, 不能再用logPrint打印了, 否则, 不是循环递归打印么?
基于上述三个实际场景, 我想出了另一种打印日志的调试方法: 用fprintf把日志写到文件中。 我已经多次用过这种方法, 屡试不爽, 非常奏效。 如果大家以后遇到类似上面三点的问题, 可以考虑用fprintf把日志写到文件。
值得注意的是, 我说写到文件, 主要是为了调试, 而不是说, 代码中所有的logPrint地地方都应该换成fprintf.
最后, 我来附上fprintf使用的一段小代码:
#include <stdio.h>
int main()
{
{
FILE *fp = fopen("myLog.txt", "a"); // 为了简便起见, 下面不检查fp
fprintf(fp, "taoge:%s\n", "hello world");
fclose(fp);
}
return 0;
}