程序错误

  1. 编译错误:编写程序的时候没有符合语言规范导致编译错误【语法错误】。

  2. 运行时错误:编译器检查不出这种错误,但在运行的时候可能会导致程序崩溃【如:内存地址非法访问】。

  3. 逻辑错误:编译和运行都很顺利,但是执行结果不对

gdb调试逻辑错误

示例-实现逆序输出字符串hello,但是却没有任何输出

#include <stdio.h>
int main(void)
{
    int i; 
    char str[6] = "hello";
    char reverse_str[6] = "";

    printf("%s\n", str);
    for (i=0; i<5; i++)
            reverse_str[5-i] = str[i];
    //Error:应该是reverse_str[4-i]...

    printf("%s\n", reverse_str);
    return 0;
}

gdb调试段错误

段错误是由于访问非法地址而产生的错误。

  1. 访问系统数据区,尤其是往系统保护的内存地址写数据。 > 最常见就是给一个0地址指针赋值

  2. 内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域

示例

#include <stdio.h>
#include <stdlib.h>

void segfault1()
{
    int *p = NULL;
    *p = 100;
}

void segfault2()
{
    char buf[1] = "a";
    buf[13] = 'A';
    printf("%c\n",buf[13]);
}

void segfault3()
{
    char buf[1] = "a";
    buf[10] = 'A';
    printf("%c\n",buf[10]);
}

int main()
{
    segfault1();
//  segfault2();
//  segfault3();
    return 0;
}

where命令 or bt命令:栈回溯,显示导致段错误的执行函数树

wh命令查看程序代码窗口

core文件调试

  1. core文件 在程序崩溃时,一般会生成一个文件叫core文件。 core文件记录的是程序崩溃时的内存映像,并加入调试信息。 core文件生成的过程叫做core dump
  2. 设置生成core文件

    ulimit -c   查看core-dump状态

    ulimit -c 数字 (如:ulimit -c 1024

    ulimit -a 用于查看当前所有状态信息

    ulimit -c unlimited写入~/.bashrc,则默认会生成core文件

  3. gdb利用core文件调试

    gdb 程序名 [core-file] 如:gdb bugging core