C语言调试手段:锁定错误的实现方法_C 语言

在项目开发工程中,如果能确定哪个文件下的哪个函数下的哪行出错--即锁定错误,那该多好啊,该文章就是为此而作的。
首先来了解一下文件默认的输出信息的函数吧:
文件信息函数:

复制代码 代码如下:

printf("line : %d\n", __LINE__);                   //当前行数
printf("filename : %s\n", __FILE__);             //当前文件名
printf("function : %s\n", __FUNCTION__);  //当前函数
printf("time : %s\n", __TIME__);                  //当前时间
printf ("date : %s\n",  __DATE__);              //当前日期
输出:
line : 10
filename : test.c
function : main.c
time : 14:13:51
date : Oct 13 2012

理论已足,那就来看看如何锁定错误吧:
一、源文件:

复制代码 代码如下:

[root@localhost for_test]# cat erroutput.c
#include <stdio.h>
#include <assert.h>
#define _DEBUG(msg...)    printf("[ %s,%s, %d ]=>",__FILE__, __FUNCTION__, __LINE__);  printf(msg);printf("\r\n")
#define _ERROR(msg...)    printf("[ error: %s, %d]=>", __FILE__,  __LINE__);printf(msg); printf("\r\n")
#define _ASSERT(exp)      \
                        do {\
                                if (!(exp)) {\
                                printf( "[ %s ]  ",#exp);printf("\r\n");\
                                assert(exp);\
                                }\
                        } while (0)
int main(void)
{
        char *p = NULL;
        _DEBUG("DEBUG!");
        _ERROR("ERROR!");
        _ASSERT(NULL != p);
        return 0;
}

二、输出:

复制代码 代码如下:

[root@localhost for_test]# gcc erroutput.c
[root@localhost for_test]# ./a.out
[ erroutput.c,main, 17 ]=>DEBUG!
[ error: erroutput.c, 18]=>ERROR!
[ NULL != p ]
a.out: erroutput.c:19: main: Assertion `((void *)0) != p' failed.
已放弃

TI处理:

复制代码 代码如下:

#ifdef DEBUG
    #define DBG(fmt, args...)  printf("Debug " fmt, ##args)// ##运算符用于把参数连接到一起。预处理程序把出现在##两侧的参数合并成一个符号。
#else
    #define DBG(fmt, args...)
#endif
#define ERR(fmt, args...)  printf("Error " fmt, ##args)
[root@localhost for_test]# cat debug_err.c
#include <stdio.h>
//#define DEBUG
int main(void)
{
       DBG("xxxx\n");
       ERR("xxxx\n");
       return 0;
}
[root@localhost for_test]# ./a.out
Error xxxx

#ifdef __DEBUG
    #define DBG(fmt, args...) fprintf(stderr,"Encode Debug: " fmt, ## args)
#else
    #define DBG(fmt, args...)
#endif
#define ERR(fmt, args...) fprintf(stderr,"Encode Error: " fmt, ## args)

时间: 2024-12-21 03:14:19

C语言调试手段:锁定错误的实现方法_C 语言的相关文章

VC++实现通过API来查看程序错误信息的方法_C 语言

本文实例介绍了VC++通过API查看错误信息的方法,可以在遇到错误的时候,将显示出错信息并退出处理,具体的实现代码如下: if((m_hBitMap=(HBITMAP)::LoadImage(NULL,filepath,IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE))==NULL) { LPVOID lpMsgBuf; DWORD dw = ::GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOC

C语言简单实现计算字符个数的方法_C 语言

本文实例讲述了C语言简单实现计算字符个数的方法.分享给大家供大家参考.具体如下: char_counting.c如下: #include<stdio.h> int main() { long nc; nc = 0; while(getchar() != '0') { ++nc; } printf("%ld\n", nc); } 编译和使用下: 复制代码 代码如下: gcc char_counting.c -o char_counting.o   一种通常的调用方式: 复制代

C语言实现计算树的深度的方法_C 语言

本文实例讲述了C语言实现计算树的深度的方法.是算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: /* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream> using namespace std; struct Node { Node(int i = 0, Node *l = NULL, Node *r = NULL) : data(i), left(l), right(r) {}

使用C语言来解决循环队列问题的方法_C 语言

题目描述:     大家都知道数据结构里面有一个结构叫做循环队列.顾名思义,这是一个队列,并且是循环的.但是现在,淘气的囧哥给这个循环队列加上了一些规矩,其中有5条指令:     (1) Push K, 让元素K进队列.     (2) Pop,对头元素出队列.     (3) Query K,查找队列中第K个元素,注意K的合法性.     (4) Isempty,判断队列是否为空.     (5) Isfull,判断队列是否已满.     现在有N行指令,并且告诉你队列大小是M. 输入:   

C语言实现奇数阶魔方阵的方法_C 语言

本文实例讲述了C语言实现奇数阶魔方阵的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: #include "stdio.h" #include "string.h" #include "stdlib.h" #define N 5 void main(){ int a[N][N]={0}; int i,j; int k; i = 0; j = N/2; a[0][j]=1; for(k = 2; k <= N*N; k++

利用C语言替换文件中某一行的方法_C 语言

文件中存贮的内容如下所示: 11 1122 0 1122 * * 0 0 22 222 0 222 * * 0 0 33 333 0 333 * * 0 0 通过使用下面的几个函数,fopen,fprintf,fscanf,fseek,ftell . 具体的函数函数原型如下所示: FILE*fopen(const char*filename,const char *mode); int fprintf(FILE*stream,const char *format,...) int fscanf(

c语言中字符串分割函数及实现方法_C 语言

1.问题引入 自己在写一个linux下的模拟执行指令的时候,遇到了输入"cat a.c",要将该字符串分解成cat和a.c两个单独的字符串,虽然知道有strtok的存在,但是想自己尝试写一下,于是就自己写了一个,不过总是遇到这样或那样的问题,虽然最后调通了,不过确浪费了不少时间:后来作业交上去以后又仔细阅读了strtok函数,发现原来linux下已经改成strsep,所有在这里就写一下自己所走的过程. 2.自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a

Linux下semop等待信号时出现Interrupted System Call错误(EINTR)解决方法_C 语言

错误现象:(semop函数调用,strerror(errno)输出结果)Interrupted system call平台:RedHat Linux LINUX文档关于EINTR的描述是这样子的:  While blocked in this system call, the process caught a signal.UNIX文档[IEEE Std 1003.1-2008]关于EINTR的描述是这样子的:  The semop() function was interrupted by a

undefined reference to `SetPduPowerConsumptionCnt&#039;错误的解决方法_C 语言

问题:程序模型用C++语言编写,在程序模型和调用函数之间添加了一个接口文件modelc.cpp,用来让用c语言程序调用程序模型中的函数: 新添加了两个函数setPduPowerConsumptionCnt()和setPduPowerConsumptionTot(),用来清除PDU模型中的总功耗和功耗计数器: 编译时出现错误提示: 复制代码 代码如下: dingq@wd-u1110:~/hwsvn/2sw/1prj_linux/pdu/src/branches/pdu-isocket$ make