C程序bug精确定位

本文主要介绍如何利用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行失败, 也正是错误出现的地方。
时间: 2024-08-29 02:18:25

C程序bug精确定位的相关文章

[调试逆向] 学会使用windbg定位程序bug

学会使用windbg定位程序bug - 原文地址:https://www.cnblogs.com/zhehan54/p/9436629.html

在程序中实现定位功能

Core Location是iOS SDK中一个提供设备位置的框架.可以使用三种技术来获取位置:GPS.蜂窝或WiFi.在这些技术中,GPS最为精准,如果有GPS硬件,Core Location将优先使用它.如果设备没有GPS硬件(如WiFi iPad)或使用GPS获取当前位置时失败,Core Location将退而求其次,选择使用蜂窝或WiFi. Core Location的大多数功能是由位置管理器(CLLocationManager)提供的,可以使用位置管理器来指定位置更新的频率和精度,以及

程序Bug导致了天大的损失,要枪毙程序员吗?

转自 http://www.cocoachina.com/programmer/20160331/15835.html 号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句号.这个判例将对 IT 行业产生深远的影响:如果程序的 bug 导致了巨大的经济损失,应该由谁来承担?用户?运营商?还是系统开发商? bug:计算机程序里的错误 今天故事的主角是,

关于程序员如何减少程序Bug的若干建议

毫无疑问,程序员是善于思考问题的一族.一个程序的编写都是通过:思考.设计.编写.调试.测试以及运行这些基本的阶段. 但大部分程序员都有一个问题就是不太愿意测试自己的代码.他们草草的调式完成以后就认为工作结束,测试那是测试人员的工作. 按照理论上,如果代码存在问题,那么测试人员和最终的用户肯定可以发现这些 BUG ,而等待哪个时候再返回来查找问题到底错在什么地方确实代价不小,其代价有: 1. 影响了程序员自己的声誉 2. 影响了产品的质量 3. 影响了客户的信任度 4. 这个时候再 DEBUG 难

程序地址重定位和模块绑定

1.程序的构建 在构建程序的时候,链接器都会给程序设置一个默认的加载地址,即首选基地址,它表示该模块被映射到进程地址空间时最佳的内存地址.默认情况下,对于EXE程序而言,windows链接器会将它的首选基地址设置为0X400000(四十万),而DLL程序的首选基地址则被设置为0X10000000(1千万),然后链接器将该地址以及一些相关数据和代码的地址写入到PE文件中.首选基地址的是为了系统程序加载器设计的,作用是告诉加载器把程序优选加载到该首选基地址,然后就可以直接将其他的数据和代码加载到内存

一个小小的程序Bug竟值400亿?

事件背景 日本公司J-Com在首次公开上市的日子就爆炸式地损失了超过400亿日元的天价损失,虽然日元那面额画得跟冥币似的,400亿日元也还是相当值些银子滴(按照当时的汇率,约为人民币27亿元). 事件的大致经过是由于一位操作员在离开盘还有几分钟的时候接到了一位客户"以61万日元的价格,卖出1股J-Com的股票"的委托,而田中君在接到委托后在交易终端上错误地输入了"以每股1日元的价格,卖出61万股". 至此,大家可想而知,事件继续发展下去会是怎样的灾难.但是,幸运的是

window.location.hash 页面跳转,精确定位,实例展示:

window.location.hash 页面跳转,精确定位,实例展示: (1).index.phtml,页面用于传参 <script id="bb_list_template" type="text/x-dot-template"> <a title="点击查看宝贝详情" href="<?php echo APP_WEB_INDEX_ROOT?>/item/itemdetail<?php echo

程序bug导致了天大的损失,要枪毙程序猿吗?

程序bug导致了天大的损失,要枪毙程序猿吗? 作者: 雷子  发布时间: 2016-03-24 10:34  阅读: 33465 次  推荐: 63   原文链接   [收藏] 文/雷子,来源/公众号:东京 IT 人 号外!号外!走过,路过,不要错过!日本 IT 业的狗血八卦继续独家放送啦!! 2015 年 9 月 3 日,随着东京最高法院驳回瑞穗证券的上诉,维持二审的原判结果,一个长达 10 年的诉讼终于画下了句号.这个判例将对 IT 行业产生深远的影响:如果程序的 bug 导致了巨大的经济损

S5PV210裸机程序之重定位与链接脚本

s5pv210开发板要求代码在0xD0020010处开始执行(BL1),但是有时我们的程序需要重定位在另外一个地址执行(如uboot),这个时候需要我们在汇编代码处加入重定位操作的代码,使得程序能够长跳转到另外一个地址继续执行代码而不会因为执行了与地址有关编码而导致执行错误. 链接脚本如下: SECTIONS {     . = 0xD0024000;     .text : {         start.o         * (.text)         }     .data : {