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

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

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

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

于是,为了解决这个问题(就是编译程序时各类提示信息频繁刷屏,导致实际有用的信息被淹没在海量信息里,很难查阅),或者说,为了预防类似的问题再次出现,我就在想有没有什么比较好的招数呢?自然,大多数人都会想的到,最常用的一招就是,编译时使用静默输出的配置,即:

make -s

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

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

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

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

有了他们各自的代号,我们就可以进行分流,将你不太关注的信息输出到文件里去,有空再慢慢查阅。而将你关注的信息输出到屏幕上,实时获取。具体有以下几种组合方式:

1、将所有信息全部输出到屏幕

这个就不用多说了,直接一个make命令下去就好

make xxx             # 输出所有的提示信息到屏幕上
make xxx -s             # 仅输出警告及错误信息到屏幕上

2、将所有信息全部输出到文件

可以实现将所有信息全部输出到同一个文件,也可以分开输出到不同的文件。

make xxx 1>info.log 2>warn.log     # 1表示常规提示信息,2表示警告及错误信息
make xxx > all.log 2>&1           # 其中的2>&1表示错误信息输出到&1中,而&1指的是all.log

3、将常规提示信息输出到屏幕,而将警告错误信息输出到文件

就是说,无关紧要的提示信息刷屏刷掉没关系,但是错误及警告信息全部输出到日志文件了,事后可以去慢慢查阅。适用于那些警告错误信息会非常多,可以一个个慢慢处理的场合。

make xxx 2> info.log          # 警告及错误信息分流到log文件中去

4、将常规提示信息输出到文件,而将警告错误信息输出到屏幕

就是说,海量的常规提示信息全部分流到文件中去了,屏幕上只剩下一些很关键的警告及错误信息,易于提取和处理。适用于那些警告及错误信息不太多,又必须现场逐个处理的场合。

make xxx 1> warn.log          # 常规提示信息分流到log文件中去
make xxx > warn.log          # 1不写也可以,因为系统默认就是1

注意:上面所有的1/2等数字,后面紧跟着大于号’>’ ,中间不能有空格!大于号">"与输出文件名中间,则可以紧跟,也可以加一个空格。

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

  1. 将Linux下编译的warning警告信息输出到文件中

    Linux中,脚本语言环境中,即你用make xxx即其他一些普通 linux 命令,比如ls,find等,不同的数字,代表不同的含义:  数字 含义 标准叫法 0 标准输入 stdin = stan ...

  2. 将Linux脚本中的正常输出,警告,错误等信息输出到文件中

    将Linux脚本中的正常输出,警告,错误等信息输出到文件中 转载于:https://www.cnblogs.com/lwmp/p/7700339.html

  3. man 输出的帮助信息输出到文件中

    man  iptables |col -b >man.text

  4. java文件保存异常_Java 实现把异常信息写入到文件中

    示例代码如下: import java.io.File; import java.io.FileNotFoundException; import java.io.PrintStream; publi ...

  5. linux输出和错误信息文件,Log4j配置将错误信息输出到指定文件中[linux tomcat]

    在使用log4j的时候,我们常常需要将错误信息输出到指定路径的文件中 以便于以后查询出错信息 在网上搜了很多资料都是写的windows下的输出方法,而且很多都是不负责任的直接E:// 很多时候我们希望 ...

  6. python使用logging打印信息到日志文件中

    python使用logging打印信息到日志文件中 参考 Python输出日志信息 Python + logging 输出到屏幕,将log日志写入文件 使用logging打印日志到文件中的目的是: 解 ...

  7. Linux shell脚本执行后出现语法错误: 未预期的文件结尾

    Windows环境下编写了一个shell脚本,上传到Linux环境中执行,Linux shell脚本执行后出现 语法错误: 未预期的文件结尾. 出现了此错误提示,进行了如下的检查:1.检查Shell脚 ...

  8. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  9. 将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件 中

    package again;import java.io.*;/* 1.编写一个程序,将 a.txt 文件中的单词与 b.txt 文件中的单词交替合并到 c.txt 文件 中,a.txt 文件中的单词 ...

  10. CodeSmith实用技巧(八):生成的代码输出到文件中

    在CodeSmith中,要把生成的代码文件输出到文件中,你需要在自己的模版中继承OutputFileCodeTemplate类.<?xml:namespace prefix = o ns = & ...

最新文章

  1. Linux centos 安装VNC 服务过程
  2. 10-Linux 基本指令
  3. 求职必备:如何用产品思维写简历
  4. 60-200-060-使用-命令-MySQL事务相关命令
  5. [MVC学习笔记]4.使用Log4Net来进行错误日志的记录
  6. 利用爬虫大量抓取网页图片
  7. php_curl-5.4.3-VC9-x64下php_curl.dll加载出错
  8. linux LCD驱动实验
  9. 对称加密+非对称加密,实现数据安全传输
  10. 史上最全2019届秋招备战攻略
  11. Python开发【Django】:组合搜索、JSONP、XSS过滤
  12. 苏炳添博士论文研究自己,奥运学术两兼顾,还是暨大副教授,网友:真正的Run数据...
  13. 部署Kubernetes时出现ImagePullBackOff或ErrImagePull情况
  14. java自动违例设计,如何在Java中创建自己的违例
  15. (二)买基金的成本知识
  16. 第 13 章 可扩展性设计之 MySQL Replication
  17. Windows动态磁盘转换为基本盘
  18. tl-wdr5620虚拟服务器,TP-Link TL-WDR5620路由器怎么设置?
  19. 程序员是如何低调炫富的?
  20. 蓝桥杯比赛时间在什么时候_CFA报名时间是什么时候_CFA

热门文章

  1. 自写:二维码签到程序,功能咋能完善一些?
  2. 迅为STM32MP157开发板使用手册更新啦
  3. 电脑linux 开启热点hostapt,在Ubuntu系统的电脑上开启无线热点全攻略
  4. pythonplc曲线_启蒙篇-立志做PLC圈子里的IT大拿 | 利用VB编写程序读取PLC数据
  5. codelite开发php,C++跨平台开发环境(CodeLite)
  6. 《墨宝非宝经典作品合集(套装共10册)》墨宝非宝(作者)epub+mobi+azw3格式下载...
  7. [渝粤教育] 平顶山学院 学前心理学 参考 资料
  8. 鼠标回报率测试软件用哪个,揭开鼠标的秘密 艾尚教你如何测回报率
  9. win10电脑锁屏快捷键
  10. [开发过程]<项目管理>TAPD工具