#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内容。