Linux操作系统使用及C高级编程-D17D18编译与调试

编译

Linux操作系统使用及C高级编程-D17D18编译与调试_第1张图片

Linux操作系统使用及C高级编程-D17D18编译与调试_第2张图片

 当有线程创建时编译:gcc test.c -o test -lpthread

分文件编写时主要是分为:.c(函数声明的具体实现)、.h(说明性文件:#define 结构体共用体 声明)、.c(main)


 条件编译

一般情况下,要对每一行都进行编译。当希望只对其中一部分内容进行编译时,需要用到条件编译。

Linux操作系统使用及C高级编程-D17D18编译与调试_第3张图片

 下图为模拟部分程序需要在x86运行,当不需要运行时就不定义3,而当需要运行时则定义3行Linux操作系统使用及C高级编程-D17D18编译与调试_第4张图片

还可以使用ifndef

Linux操作系统使用及C高级编程-D17D18编译与调试_第5张图片

 有两种编译方式:根据宏定义进行条件编译;根据宏的值是否为真来进行条件编译

Linux操作系统使用及C高级编程-D17D18编译与调试_第6张图片

使用gcc命令中的-D参数来动态注册宏定义

Linux操作系统使用及C高级编程-D17D18编译与调试_第7张图片

Linux操作系统使用及C高级编程-D17D18编译与调试_第8张图片

 GDB调试工具

b:打断点

r:运行

bt:查看栈信息

c:继续运行

n:单步调试

e(edit):

l(list):查看代码内容,一次十行

s(step):进入函数内部,查看函数

help:帮助手册

quit:提出GDB

以下程序进行调试

#include

#ifdef _PRINT_
void print()
{
    printf("hello world\n");
}
int main(int argc, const char *argv[])
{
    int i;

    for (i = 0; i < 5; i++)
        printf("%d\n",i);

    print();
    return 0;
}

#endif

#ifdef _CORE_
#include

int main(int argc, const char *argv[])
{
    int *temp = NULL;

    *temp = 10;
    return 0;
}

#endif

#ifdef _ING_
#include
#include

int main(int argc, const char *argv[])
{
    while(1)
    {
        int i;
        i++;
        printf("%d\n",i);
        sleep(1);
    }    
    return 0;
}

#endif

Linux操作系统使用及C高级编程-D17D18编译与调试_第9张图片

 一些命令使用示例

Linux操作系统使用及C高级编程-D17D18编译与调试_第10张图片

Linux操作系统使用及C高级编程-D17D18编译与调试_第11张图片

 GDB调试core文件

core文件:操作非法地址,会报段错误生成的文件

gcc -g gdb.c -o test_core -D _CORE_,在运行了./test_core后就会生成一个core文件

Linux操作系统使用及C高级编程-D17D18编译与调试_第12张图片

 运行gdb test_core core就会出现出错原因,其中#0错误原因,并显示出代码在哪里出现了问题(28行)

Linux操作系统使用及C高级编程-D17D18编译与调试_第13张图片

 GDB调试正在运行的进程

比如说服务器不能让它停下来,再进行调试

gcc -g gdb.c -o test_ING -D _ING_

./test_ING运行

先使用ps aux | grep gdb_ING查找进程号为3465

接着使用gdb gdb_ING -p 3465进入调试

Linux操作系统使用及C高级编程-D17D18编译与调试_第14张图片

 接着和正常调试的都一样

你可能感兴趣的:(c语言,linux)