GDB使用和段错误调试技巧

本文介绍了GDB的使用方法,包括编译时添加-g选项、设置断点、查看变量和栈信息等。特别关注了最常见的错误——非法内存访问(段错误),并详细阐述了段错误的调试步骤,如生成和分析core文件。尽管GDB不总是能精确找到错误位置,但仍然是调试工具中的重要一环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于gdb


  • test: debug.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BIGNUM 1111

void array(int ary[]);

int main(int argc, char *argv[])
{
    int i[100];
    /*选择性编译的时候gcc -o debug debug.c -DDEBUG*/
    #ifdef DEBUG
    printf("[%d]\n", __LINE__);//打印行号
    #endif

    array(i);

    #ifdef DEBUG
    printf("[%d]\n", __LINE__);
    #endif

    exit(1);
}

void array(int ary[])
{
    int i;
    for(i=0; i<BIGNUM; i++)
    {
        ary[i] = i;
    }
}

1,编译的时候,要加上-g : gcc -o debug debug.c -g
2,使用gdb来启动待调试代码:

   gdb ./debug

3,列出待调试代码:

   l
   list
   l 10  (显示第10行)
   l 1,30  (显示第1行到30行)

4,设置断点:

   b 10  (在程序的第10行,设置一个断点)
   b 20 if i>= 5 (在程序的第20行,设置一个断点,并且只有当i>=5时才停下来)
   info b (查看所设置的断点的信息)
   delete N  (删除第N号断点)
   disable N (禁用第N号断点)
   enable N  (启用第N号断点)

5,启动待调试代码:

   run
   r
   r abcd 1234 (带参数)

6,查看相关的变量、栈的信息:

   print i
   p i
   display i  (跟踪显示变量的值)
   backtrace full (查看当前进程的栈的信息)
   bt full
   whatis i (查看变量i的类型)

7,单步调试

   next (单步运行:将函数调用看作一步)
   n
   n 10

   step (单步运行:会进入函数调用)
   s
   s 10 (运行10次)

8,继续运行代码:

   continue (让进程持续运行,直到遇到断点,或者进程退出为止)
   c

9,退出gdb:

   quit

最常见的错误:非法内存访问(段错误 / segmentation fault)


该种错误的调试步骤:
1,编译: gcc -o debug debug.c -g
2,取消系统对core文件大小的限制:

   ulimit -c unlimited

3,让有段错误的代码去死,产生一个core文件

   ./debug

4,让gdb帮我们看看在哪里出错:

   gdb ./debug core

注:
gdb不一定100%地能找到错误的地方,如果找不到,还是要自己一步一步地找。我们要根源上写代码的时候就要避免出现此类错误,预防大于治疗。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值