使用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


相关文章
|
16天前
|
存储 C语言
[C语言/PTA] 建立学生信息链表
[C语言/PTA] 建立学生信息链表
55 0
|
4月前
|
C语言 C++
ffmpeg解码之使用C语言打印音视频信息
ffmpeg解码之使用C语言打印音视频信息
46 0
|
8月前
|
C语言 Windows
C语言实现通讯录【文件版】——存档联系人信息
C语言实现通讯录【文件版】——存档联系人信息
|
10月前
|
存储 C语言
PE导出表,C语言打印导出表信息【滴水逆向三期49笔记+作业】(下)
PE导出表,C语言打印导出表信息【滴水逆向三期49笔记+作业】
|
10月前
|
存储 C语言
PE导出表,C语言打印导出表信息【滴水逆向三期49笔记+作业】(上)
PE导出表,C语言打印导出表信息【滴水逆向三期49笔记+作业】
|
10月前
|
C语言
【滴水逆向三期41作业】C语言提取文件PE头部信息
【滴水逆向三期41作业】C语言提取文件PE头部信息
|
API C语言 Windows
C语言SetConsoleCursorPosition()函数来定位光标位置
SetConsoleCursorPosition(参数1,参数2)函数来定位光标位置。 参数1:句柄(通过GetStdHandle()函数获得句柄) 参数2:位置(结构体类型)
115 0
C语言SetConsoleCursorPosition()函数来定位光标位置
|
数据安全/隐私保护 C语言
【C语言】制作“学生管理成绩系统”,内容包括【系统显示】【录入信息】【删除信息】【等级评定】【成绩排序】【成绩修改】【查找学生】涉及循环、结构体和数组等
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢? 导言 学生菜单系统是基于前阶段的C语言学习,从实际出发,巩固C语言基础的练习,通过多种函数的不同运用,检验知识点的牢固可靠性。 系统设计概述 整个学生系统将会被分成几个内容,将大任务分为多个小任务,并将其合理连接起来,独立而又有联系,对逻辑能力有一定要求(没错,我是木头) 设计多个模块 开发团队信息(即首
【C语言】制作“学生管理成绩系统”,内容包括【系统显示】【录入信息】【删除信息】【等级评定】【成绩排序】【成绩修改】【查找学生】涉及循环、结构体和数组等
|
C语言 索引
C语言 文件读写综合案例:读取LOL信息
C语言 文件读写综合案例:读取LOL信息
251 0
C语言 文件读写综合案例:读取LOL信息
|
C语言 关系型数据库 PostgreSQL