码迷,mamicode.com
首页 > 其他好文 > 详细

C程序bug精确定位

时间:2015-05-14 16:04:34      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:

本文主要介绍如何利用C标准宏定义(__FILE__, __FUNCTION__, __LINE__)结合assert来更精确的定位导致assert的出错点。尤其在带有深层的函数嵌套调用的复杂程序中,使用__FILE__, __FUNCTION__, __LINE__这3个工具在追踪模糊不清的bug时非常重要。

 

宏assert的原型定义在头文件<assert.h>中,其作用是如果测试的条件返回错误(即测试等于0),则终止程序执行。 原型定义如下:

#include<assert.h>

Void assert(int expression);

 

程序清单如下:

 

/**

*   filefcn.h - a function to open files

**/

 

#ifndef _FILEFCN_H_

#define _FILEFCN_H_

 

int open_file(FILE** fp, char* fname, char* mode, int line, char* file, char* func);

 

#endif /**_FILEFCN_H_ */

 

 

 

/**

* filefcn.c - using __FILE__, __FUNCTION__, __LINE__

**/

 

#include<stdio.h>

#include "filefcn.h"

 

int open_file(FILE** fp, char* fname, char* mode, int line, char* file, char* func)

{

    if((*fp = fopen(fname, mode)) == NULL)

    {

        fprintf(stderr, "[%s:%s:%d] open_file() failed\n", file, func, line);

        return 1;

    }

    return 0;

}

 

#include <stdio.h>

#include <stdlib.h>

#include <assert.h>

#include "filefcn.h"

 

int main()

{

    //printf("Hello world!\n");

    FILE* fp;

 

    fp = fopen("foo_bar", "w");

    assert(fp);

    fclose(fp);

 

    fp = fopen("baz_bar", "r");

    /**

    * other code

    */

    assert(fp);

    fclose(fp);

 

    #if 0

 

    /**this call will fail*/

    if(open_file(&fp, "foo_bar", "w", __LINE__, __FILE__, __FUNCTION__))

        exit(EXIT_FAILURE);

    else{

        fputs("hello, world\n", fp);

        fclose(fp);

    }

 

    /** this call will fail*/

    if(open_file(&fp, "baz_bar", "r", __LINE__, __FILE__, __FUNCTION__))

        exit(EXIT_FAILURE);

    else

        fclose(fp);

    #endif

 

    return 0;

}

 

运行结果:

 技术分享

技术分享

 

说明:

  1. Assertion失败的源代码文件为main.c,调用assert失败的语句行号是19(注意这不是真正出错的地方,而是检测到出错的地方)
  2. 利用标准宏准确检测到程序在mian.c文件34行失败, 也正是错误出现的地方。

C程序bug精确定位

标签:

原文地址:http://www.cnblogs.com/hzwackerman/p/4503469.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!