有没有人对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*/ } 

您还可以使用更多参数来指示哪个模块正在发送错误,但我认为基本上就是这样。