GDB使用和段错误调试技巧

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/guang_Zh/article/details/50218199
            </div>
                                                <!--一个博主专栏付费入口-->
         
         <!--一个博主专栏付费入口结束-->
        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-4a3473df85.css">
                                    <div id="content_views" class="markdown_views">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <h1 id="关于gdb"><a name="t0"></a>关于gdb</h1>

  • 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

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

   gdb ./debug
 
 
  • 1

3,列出待调试代码:

   l
   list
   l 10  (显示第10行)
   l 1,30  (显示第1行到30行)
 
 
  • 1
  • 2
  • 3
  • 4

4,设置断点:

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

5,启动待调试代码:

   run
   r
   r abcd 1234 (带参数)
 
 
  • 1
  • 2
  • 3

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

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

7,单步调试

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

   step (单步运行:会进入函数调用)
   s
   s 10 (运行10次)
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

8,继续运行代码:

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

9,退出gdb:

   quit
 
 
  • 1

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


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

   ulimit -c unlimited
 
 
  • 1

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

   ./debug
 
 
  • 1

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

   gdb ./debug core
 
 
  • 1

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值