描述
有一個程式通過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,都輸出。