2016-04-20 73 views
-4

我將一些非常臨時的調試打印放入各種用戶空間程序中,以找出在嵌入式Linux設備上運行的代碼,並且我希望這些打印可以在不打開的情況下寫入文件。爲了使調試在各種程序之間更具可移植性,可以單獨打開一個文件,寫入並關閉它,而不必在其他地方定義函數/宏,這將是一件好事。我可以這樣做:fopen單線程,fprintf,fclose?

{ FILE *f = fopen("filename", "a"); if (f) { fprintf(f, "DEBUG MSG\n"); fclose(f); } else printf("File open error!\n"); } 

這是剛剛從刪除空格:

{ 
    FILE *f = fopen("filename", "a"); 
    if (f) { 
     fprintf(f, "DEBUG MSG\n"); 
     fclose(f); 
    } 
    else 
     printf("File open error!\n"); 
} 

但這種感覺不必要的複雜性。有沒有更簡化的方法呢?同樣,我不是在說它是一個函數,因爲我希望它能夠在單獨的程序之間進行復制/粘貼,而不必每次都定義一個函數。它基本上是用戶空間的臨時printk等價物。

+12

通常這些單行程被稱爲函數... – squiguy

+0

單行在'在源代碼'中?最好使它成爲一個宏,所以你可以在以後輕鬆地禁用它。 – usr2564301

+0

當然:把日誌記錄放到一個單獨的模塊中,儘早從'main'調用該模塊的「open」函數,在你結束程序和'log'函數之前調用''close'函數在任何你想寫入的地方日誌文件。 – Olaf

回答

0

正如馬克Plotnick提到,Linux系統解決方法是:

system("echo DEBUG MSG >> filename"); 

它不漂亮,但它的快速,複製/ pasteable,以及易於使用的這種情況,因爲它也可以寫到/dev/kmsg

system("echo DEBUG MSG >> /dev/kmsg"); 

它允許它表現得像一個printk。當然,這不是一個安全的解決方案,不能與任何干擾bash回顯的字符一起使用,但對於臨時靜態調試消息它可以正常工作。

+1

注意:這是一個操作系統特定的解決方案。這篇文章沒有指定操作系統,並且「運行在嵌入式設備上」,這意味着甚至可能沒有底層操作系統。 – chux

+0

好點。我在這個問題上加了這個。我希望有一個更通用的解決方案(比如一個我沒有意識到的庫函數或者其他的東西),但是這個解決了我的情況。 – vestlen

5

Functions.


額外字符我簡短的回答。

1

fprintf(f, "DEBUG MSG\n");

潛在的問題,我認爲"DEBUG MSG\n"是一些佔位符的真實信息。如果真的消息包含'%',那麼該函數將查找缺失的參數。使用fputs() - 它的CPU可能比fprintf()更輕。

fputs(debug_message, f); 

真正的消息可能缺乏一個'\n',然後得到一個程序崩潰停留在緩衝前夕。完成後最好沖洗。

​​

迂迴:調試是爲了解決問題。信息本身往往是有問題/腐敗的。考慮使用保護。 (我不信任過長的調試消息)。當然,fprintf()中的垃圾越多,調試日誌記錄對性能的影響就越大。

if (f) { 
    if (debug_message) { 
    fprintf(f, "%.99s", debug_message); 
    fflush(f); 
    fclose(f); 
    } 
} 

正如@Tom Karzes提到的,發送診斷信息給stderr,而不是stdout。總的來說,我會用一個包含在條件宏而不是嵌入代碼中的函數調用。因人而異。

#ifdef NDEBUG 
    #define DEBUG_PUTS(level, s) 
#else 
    #define DEBUG_PUTS(level, s) debug_puts((level), __FILE__, __LINE__, (s)) 
#endif 
相關問題