有没有人对C的设计和错误跟踪/控制系统有很好的指导?
我是C开发的软件工程方面的新手; 有没有人有一个很好的指导如何为C项目(特别是嵌入式)设计错误跟踪或错误控制系统? 谈论C库的错误跟踪也会有所帮助。
根据我的经验,这里的策略属于几个阵营。
-
使用全局变量ala errno 。 这是如何工作的本质上任何函数都可以在全局变量中存储错误代码,因此在执行该函数后,您可以读取错误代码以查看它是否正确执行。 在multithreading环境中工作时,存在一些明显的问题。 虽然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中成功使用,并且个人更喜欢它,因为我发现它是限制性最小的。 唯一可能的缺点是你必须显式声明一个变量来存储错误代码,即使你不关心结果。 从某种意义上说,我实际上有点像那个要求,因为它迫使你不断思考如何处理错误。
这些链接可能会有所帮助:
- 错误:UNIX程序中的错误 – 使用标准错误机制
- 错误报告(GNU C库)
这些是您需要定义的基本内容:
- 跟踪级别(例如,调试,警报,警告,信息,严重等)。 您还应该设置当前跟踪级别,因此如果当前跟踪级别为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*/ }
您还可以使用更多参数来指示哪个模块正在发送错误,但我认为基本上就是这样。