且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

使用C语言中的宏来定位出错信息

更新时间:2022-10-01 22:55:51

    编写一个软件时,软件的健壮性时特别值得考虑的问题。使用C++时可以使用异常捕获机制,在设计完软件的模块架构的时候然后再设计异常捕获架构,一般来说需要设计一个异常捕获网来捕获程序中可能的异常。

    对于异常的处理,有些情况下没有办法实现程序的自恢复,这时候只能无奈的输出程序的出错的一些信息。在我看来,这些信息具体又分为静态信息和动态信息。静态信息是编译器期间确定的一些属性,动态期间是在运行时期间才能确定的属性。

    例如,程序模块a中的函数f的第l行出现错误,在输出错误的时候我们要能够输出这些定位错误的信息。利用C语言提供的内置宏可以得到这些信息,常用的内置宏为:__FILE__,__LINE__,__FUNCTION__,__TIME__,分别为文件名,行号,函数名,以及该模块对应得源文件被预处理器处理的时间。这些信息都是编译期间确定的,也就是我所说的静态错误信息。

    下面是一个例子:

    这个是头文件:tmp_header.h


  1. /* 
  2. *Author:Chaos Lee 
  3. *Date:2012-02-26 16:52 
  4. */ 
  5. #ifndef TMP_HEADER_H 
  6. #define TMP_HEADER_H 
  7. #include<stdio.h> 
  8. #define MSGDEBUG fprintf(stderr,"Error Occured at:\nFile:%s\nFunction:%s\nLine:%d\nDate:%s\nTime:%s\n",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIME__); 
  9. #endif 

     下面是源文件:


  1. /* 
  2. *Author:Chaos Lee 
  3. *Date:2012-02-26 16:55 
  4. */ 
  5. #include"tmp_header.h" 
  6. int main() 
  7.     MSGDEBUG; 
  8.     return 0; 

    输出结果如下:


  1. Error Occured at:  
  2. File:tmp_test.c  
  3. Function:main  
  4. Line:8  
  5. Date:Feb 26 2012  
  6. Time:17:04:27  

 

   还有一种情况就是动态信息,可以确定模块在内存中的位置,这就是常见的堆栈跟踪信息。可以调用库函数backtrace实现堆栈跟踪,这个放在下一篇文章中。

   还有一个库函数也是方便调试的,就是assert函数,下面是一个assert函数的例子。assert函数根据参数情况来决定程序的运行,如果参数判定为假或者0,将对进程发出ABORT信号,默认的情况下,程序运行结束。

   


  1. /* 
  2. *Author:Chaos Lee 
  3. *Date:2012-02-26 10:37 
  4. */ 
  5. #include<stdio.h> 
  6. #include<assert.h>  //for assert 
  7. #include<signal.h>  //for signal 
  8. void sig_abrt(int signo) 
  9.     printf("signal 'Aborted' catched.\n"); 
  10. void installSignalHandler() 
  11.     signal(SIGABRT,sig_abrt); 
  12. int main() 
  13.     int input=1; 
  14.     installSignalHandler(); 
  15.     while(input) 
  16.     { 
  17.         scanf("%d",&input); 
  18.         assert(input); 
  19.         printf("you have entered:%d\n",input); 
  20.     } 
  21.     return 0; 

    程序运行结果如下:

    


  1. 32 
  2. you have entered:32 
  3. 54 
  4. you have entered:54 
  5. assert_test: assert_test.c:23: main: Assertion `input' failed. 
  6. signal 'Aborted' catched. 
  7. Abort 

 


本文转自hipercomer 51CTO博客,原文链接:http://blog.51cto.com/hipercomer/790175