如何将linux编译过程中的警告及错误信息输出到文件中

版权声明:个人心得,欢迎来信来函交流。转载请注明出处! https://blog.csdn.net/LEON1741/article/details/82052018

作为一个完美主义者,我在windows系统下编写和调试程序时,都会小心翼翼的搞定每一个warning,使得程序最终编译出来的输出结果非常干净,简简单单的一个success,让人看的神清气爽!

然而在linux下,事情往往不如我所愿,特别是在编译一些大型的开源项目,比如u-boot、linux内核、qt等程序的源码时,一方面本身这些代码的规模就极其庞大,就算所有模块全部没有警告,仅仅是编译输出的其他各类信息(比如过程信息、配置信息、路径信息等),就已经是频繁刷屏,让人应接不暇了。这时候,若再加上一些warning信息的话,则更让人头大【注1】。而最痛苦的是,如果此时出现了一些错误,则会出现错误信息被夹杂在海量的警告信息和其他信息中,导致很难察觉和追溯,给程序的编译和调试带来极大的麻烦。此处最典型的实例就是我昨天自己亲身经历的一个事情。

注1:在实际情况中,这些warning可以说是非常的多,非常的多,也不知道怎么会有这么多。我一直想不明白,就是各位大神在编写和调试这些项目的源码时,为什么不把代码写干净一点,非得要留下这么多的warning呢,希望某日有大神能帮我解答这个问题?

昨天在编译一份I.MX6的嵌入式程序时,由于编译过程涉及到u-boot、kernel、rootfs、app、UI等多个部件,因此我们当时自己写了一个脚本进行自动化编译。而对于kernel的编译过程,是先编译出image,然后再使用lzop工具进行压缩生成zImage。那么,问题就来了,我的系统中忘了安装lzop,导致生成了image之后,没有生成配套的zImage。但是,当时我们的脚本也写的不够严谨,当出现这个问题后,脚本并没有自动停止,而是继续运行下去了。所以,当我一看到脚本全部运行成功了,也就没有去详细分析其中的过程(因为shell中的输出信息可谓是海量,正常情况下我想应该是没有人会去翻阅的),于是就以为所有程序都编译OK了,于是就直接一股脑下载到目标板上去了。结果大家肯定都猜到了,自然是出了问题。当时也是排查了很久,最后才发现问题所在。

于是,为了解决这个问题,或者说,为了预防类似的问题再次出现,我就在想有没有什么招数能够用得上呢?自然,最常用的一招就是,编译时使用静默输出的配置,即:

make -s

这样会关闭所有的其他输出信息,只保留编译过程中的警告和错误信息。显然,这种情况下,肯定比之前要好多了。但是,如上所述,很多大型开源项目中,警告信息那可也不是一般的多,分分钟就给你刷屏刷开几千里去。所以,经过我自己的亲身实践,这个办法也收效甚微,只能继续思考。

终于,通过引入“输出文件”的思路,能够比较有效的解决这个问题。具体来说就是,将输出在屏幕上的各类信息同步输出到一个指定的文件中去,一旦有什么情况,翻阅和查询那个文件,总比在shell中回滚要方便的多。

不过,在开始介绍具体的方法之前,要先对linux中的输出设备进行一下介绍。大家都知道,linux系统中默认有3个输出设备,分别为stdin、stdout、sdterr,分别表示标准输入设备、标准输出设备和标准错误设备。那么你可知道这3类设备在系统中的,都各自有一个指定的代号吗?见下表:

设备名称 标准叫法 代号
标准输入设备 stdin = standard input 0
标准输出设备 stdout = standard output 1
标准错误设备 stderr = standard error 2

有了他们各自的代号,我们就可以通过下面的方法来进行指定。具体有以下几类方法:

  • 想要把make输出的全部信息输出到文件中,最常见的办法就是:
make xxx > build_output.txt
# 此时默认情况是没有改变2=stderr的输出方式,还是屏幕,所以,如果有错误信息,还是可以在屏幕上看到的。
  • 只需要把make输出中的错误(及警告)信息输出到文件中,可以用:
make xxx 2> build_output.txt
# 同理,由于1=stdout没有变,还是屏幕,所以,那些命令执行时候输出的正常信息,还是会输出到屏幕上,你还是可以在屏幕上看到的。
  • 只需要把make输出中的正常(非错误,非警告)的信息输出到文件中,可以用:
make xxx 1> build_output.txt
# 同理,由于2=stderr没有变,还是屏幕,所以,那些命令执行时候输出的错误信息,还是会输出到屏幕上,你还是可以在屏幕上看到的。
  • 想要把正常信息和错误信息分别输出到不同的文件中,可以用:
make xxx 1> build_output_normal.txt 2>build_output_error.txt
# 联合使用了1和2,正常信息和错误信息,都输出到对应文件中了。
  • 想要把所有的信息都输出到同一个文件中:
make xxx > build_output_all.txt 2>&1
# 其中的2>&1表示错误信息输出到&1中,而&1,指的是前面的那个文件:build_output_all.txt 。

注意:上面所有的1,2等数字,后面紧跟着大于号’>’ ,中间不能有空格。

猜你喜欢

转载自blog.csdn.net/LEON1741/article/details/82052018