#include <stdio.h>
#include <stdlib.h>
int main()
{
#ifdef DEBUG
printf("Compiled: " __DATE__ " at " __TIME__ "\n");
printf("This is line %d of file %s\n", __LINE__, __FILE__);
#endif
printf("hello world\n");
exit(0);
}
将代码保存为cinfo.c,在linux中输入gcc -o cinfo -DDEBUG cinfo.c
./cinfo
执行结果如下:
Compiled: Sep 7 2017 at 00:36:49
This is line 8 of file cinfo.c
hello world
编译这个程序时启用调试,使用的是-DDEBUG。
#include <stdio.h>
typedef struct
{
char data[4096];
int key;
}item;
item array[] =
{
{"bill", 3},
{"neil", 4},
{"john", 2},
{"rick", 5},
{"alex", 1},
};
void sort(item *a,int n)
{
int i = 0, j = 0;
int s = 1;
for(; i < n-1 && s != 0; i++)
{
s = 0;
for(j = 0; j < n-1; j++)
{
if(a[j].key > a[j+1].key)
{
item t = a[j];
a[j] = a[j+1];
a[j+1] = t;
s++;
}
}
}
}
int main()
{
int i;
sort(array,5);
for(i = 0; i < 5; i++)
printf("array[%d] = {%s, %d}\n",i, array[i].data, array[i].key);
return 0;
}
在用GDB调试该程序时有如下新增技巧:
打印数组的多少个元素,比如我要打印数组array的5个元素,可以使用如下命令 print array[0]@5
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
double my(double x)
{
assert(x >= 0.0);
return x;
}
int main()
{
printf("legal +2 = %g\n", my(2.0));
printf("iglegal -2 = %g\n", my(-2.0));
exit(0);
}
如果assert中的表达式为假,会终止程序执行调用abort,在标准错误打印错误信息。在正式版本中通过在头文件assert.h 前定义宏NDEBUG禁用assert。
例子:
/* assert example */
#include <stdio.h> /* printf */
#include <assert.h> /* assert */
void print_number(int* myInt) {
assert (myInt!=NULL);
printf ("%d\n",*myInt);
}
int main ()
{
int a=10;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (b);
print_number (c);
return 0;
}
执行结果:
[root@centos-linux-7 workspace]# ./assert
10
assert: assert.c:7: print_number: Assertion `myInt' failed.
Aborted (core dumped)
如果我们在assert.h头文件前添加如下语句:
#define NDEBUG
那么在程序输出中我们看不到assert内容。