glog与stderr的奇怪bug
描述
有一个程序通过launcher启动(无终端)会间歇性卡死,用终端启动则表现正常,且注释掉代码中glog部分可以恢复正常。
分析
glog有一个FLAG叫做alsologtostderr
值为true的时候,日志信息同时输出到stderr及文件(默认值为 false)
而程序中有关parse存在错误,导致FLAG始终为true
出现大段log时会卡死
解释
这里引用一道题目完美解释stdout与stderr的区别。
我们知道,标准输出和标准错误默认都是将信息输出到终端上,那么他们有什么区别呢?让我们来看个题目:
问题:下面程序的输出是什么?(intel笔试2011)
int main(){
fprintf(stdout,"Hello ");
fprintf(stderr,"World!");
return0;
}
解答:这段代码的输出是什么呢?你可以快速的将代码敲入你电脑上(当然,拷贝更快),然后发现输出是
World!Hello
这是为什么呢?在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲 的,会直接输出,举例来说就是printf(stdout, "xxxx") 和 printf(stdout, "xxxx\n"),前者会憋住,直到 遇到新行才会一起输出。而printf(stderr, "xxxxx"),不管有么有\n,都输出。