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

简介:

    编写一个软件时,软件的健壮性时特别值得考虑的问题。使用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


相关文章
|
6月前
|
程序员 编译器 C语言
C语言库函数 — 错误信息报告函数
C语言库函数 — 错误信息报告函数
62 0
|
3月前
|
存储 C语言
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
【c语言】职工信息管理系统 包含读取写入txt文件,职工信息的增删改查
|
3月前
|
存储 数据可视化 C语言
【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】
【C语言】C语言-学生籍贯信息记录系统(源码+论文)【独一无二】
|
6月前
|
算法 搜索推荐 C语言
C语言中的分而治之与信息隐藏技术探讨
C语言中的分而治之与信息隐藏技术探讨
96 0
|
6月前
|
存储 C语言
[C语言/PTA] 建立学生信息链表
[C语言/PTA] 建立学生信息链表
122 0
|
6月前
|
C语言 C++
ffmpeg解码之使用C语言打印音视频信息
ffmpeg解码之使用C语言打印音视频信息
104 0
|
程序员 编译器 C语言
C语言库函数 — 错误信息报告函数
本文介绍错误信息报告函数 错误信息报告函数的作用: 帮助程序员快速定位代码中的错误,以便更快地进行调试和修复问题。
157 0
【滴水逆向三期41作业】C语言提取文件PE头部信息
【滴水逆向三期41作业】C语言提取文件PE头部信息
|
C语言 Windows
C语言实现通讯录【文件版】——存档联系人信息
C语言实现通讯录【文件版】——存档联系人信息
|
存储 C语言
PE导出表,C语言打印导出表信息【滴水逆向三期49笔记+作业】(下)
PE导出表,C语言打印导出表信息【滴水逆向三期49笔记+作业】