我是C開發軟件工程方面的新手;有沒有人有關於如何爲C項目(特別是嵌入式)設計錯誤跟蹤或錯誤控制系統的良好指導?談論C庫的錯誤跟蹤也會有所幫助。有沒有人對C的設計和錯誤跟蹤/控制系統有很好的指導?
4
A
回答
5
根據我的經驗,這裏的策略屬於幾個陣營。
使用全局變量ala errno。工作原理本質上任何函數都可以在全局變量中存儲錯誤代碼,因此在執行該函數之後,可以讀取錯誤代碼以查看它是否正確執行。在多線程環境中工作時,存在一些明顯的問題。雖然它appears POSIX.1c指定解決這個問題。
每個函數都返回一個錯誤代碼。例如:
RESULT_CODE my_function(int param1, int param2); RESULT_CODE error_code = my_function(10, 2);
這種方法的問題是,你失去了你與直接從函數的返回值的能力。
每個函數都有一個額外的參數來存儲結果代碼。例如:
void my_function(int param1, int param2, RESULT_CODE *err); RESULT_CODE error_code; my_function(10, 2, &error_code); switch (error_code) { case RESULT_OK: // all OK break; case RESULT_NO_MEM: // out of memory break; // etc... }
我已經看到了這種方法在商業RTOS成功使用,個人更喜歡它,因爲我覺得這是最嚴格的。唯一的潛在缺點是你必須顯式聲明一個變量來存儲錯誤代碼,即使你不關心結果。但從某種意義上說,我確實喜歡這種要求,因爲它迫使你不斷思考錯誤是如何處理的。
1
1
這些都是你需要定義基本的東西:
- 跟蹤級別(例如,調試,警報,警告,信息,關鍵等)。您還應該設置當前跟蹤級別,因此如果當前跟蹤級別爲INFO,則打印所有跟蹤級別高於info的消息。如果當前跟蹤級別很關鍵,那麼只會打印關鍵的消息。
enum _TraceLevelType
{
INFO = 0,
DEBUG,
WARNING,
ERROR,
CRITICAL
} TraceLevelType;
- 錯誤代碼,我認爲最好的辦法是有一個大的枚舉。事情是這樣的:
enum _ErrorType
{
//Internal errors 0-100
APPLICATION_FAILURE = 0,
...
MEMORY_FAULT,
//UI ERRORS 101-200
INVALID_OPTION_SELECTED = 101,
....
...
}ErrorType;
- 一個消息隊列,你應該有一個機制,每個人都可以發送消息和這些消息是正確排隊。由於您在嵌入式系統上工作,所以這非常重要。您不想花時間在實時操作系統上打印調試消息。因此,管理錯誤代碼的線程應該具有非常低的優先級,並且所有接收到的消息都應該發佈到隊列中,所以當調度程序決定調用它時,您將printfs發送到控制檯或輸出到您決定的任何輸出。
所以你的錯誤方法是這樣的:
TraceError(TraceLevelType traceLevel, ErrorType errorType, char *msg)
{
if(CURRENT_TRACE_LEVEL <= traceLevel)
/* Ignore message */
else
/*Queue the Message*/
}
你也可以有更多的參數,以指示模塊發送的錯誤,但我認爲這基本上是它。
相關問題
- 1. 跟蹤和「設備沒有準備好」
- 2. 有沒有很好的WPF控制庫?
- 3. 有沒有對象更改跟蹤/版本控制的Java API?
- 4. 對JDO有很好的指導嗎?
- 5. 測試計劃跟蹤 - 有沒有好的?
- 6. 有沒有人對依賴注入有很好的比喻?
- 7. C++:跟蹤所有現有的對象
- 8. C對沒有操作系統的微控制器有什麼限制?
- 9. 有沒有人知道DSL設計的一個很好的參考?
- 10. 一個很好的建模工具對於系統設計有多重要
- 11. 有沒有一個很好的指導,開始與Mercurial?
- 12. 沒有列表的Prolog關係跟蹤
- 13. 有沒有人知道很好的delphi對接組件?
- 14. 有沒有人爲Akka Actor系統設置類型安全控制檯?
- 15. 有沒有人對Asterisk使用的計費系統有任何建議?
- 16. 跟蹤/監控系統
- 17. 有沒有一個很好的WPF樞軸控制?
- 18. 有沒有可以跟蹤唯一錯誤的Rails庫?
- 19. 有很多關係設計
- 20. 變量導致語法錯誤沒有很好的理由
- 21. matlab:對MyBox有很好的控制,帶有文本框
- 22. 沒有好的特徵點的對象跟蹤
- 23. 有沒有更好的方式來跟蹤訂戶的變化?
- 24. 在ISO C++中有沒有對i18n和L10n有很好的參考?
- 25. c#跟蹤系統。診斷
- 26. JS:如何跟蹤有很多函數調用的錯誤
- 27. 有沒有人有一個很好的Java BitBuffer?
- 28. 有沒有不好的設計模式?
- 29. 如何在android中跟蹤沒有根設備的系統調用?
- 30. 有沒有更好的方法跟蹤分頁與標籤?
你在談論處理運行時錯誤的機制/模式嗎?或缺陷跟蹤系統(如FogBugz,Bugzilla等)? – Gabe 2009-07-21 19:53:49