博客
关于我
Linux基础学习 | gdb调试
阅读量:298 次
发布时间:2019-03-01

本文共 2377 字,大约阅读时间需要 7 分钟。

GDB 调试指南

GDB(GNU Project Debugger)是Linux和Unix系统中最强大的调试工具之一。它能够帮助开发者深入了解程序在执行过程中的内部状态,定位错误并修复问题。以下是关于GDB的一些实用知识和调试示例。


GDB 的基本用法

1. 安装 GDB

GDB 的安装方法因系统而异。通常情况下,可以通过以下命令安装:

sudo apt-get install gdb

安装完成后,可以通过终端运行 gdb 命令进入调试环境。

2. 简单的调试命令

查看帮助文档

GDB 提供丰富的命令行帮助,使用以下命令查看所有调试命令:

help

列出源代码

使用 list 命令可以查看程序的源代码:

list

可以指定行号或函数名:

list 5list fib

单步调试

next 命令用于单步执行程序:

next

或使用简写 n

n

跳转到函数

step 命令可以跳转到函数定义处:

step fib

查看堆栈信息

backtrace 命令(简写为 bt)可以显示当前函数调用的堆栈信息:

bt

查看局部变量

info 命令(简写为 i)可以查看当前栈帧中的局部变量:

info

实际调试示例

示例 1:斐波那契数列程序的调试

问题描述

编写一个斐波那契数列函数,发现当输入 n 为负数时,程序会进入死循环。

int fib(int n) {    int a = 0, b = 1, t;    while (n--) {        t = a + b;        a = b;        b = t;    }    return a;}int main() {    int n = 0;    for (; n < 10; n++) {        printf("斐波那契数列第 %d 项为: %d\n", n, fib(n));    }    return 0;}

调试过程

  • 生成调试版本

    使用 gcc 编译器添加调试信息:

    gcc -g test.c -o test
  • 进入调试环境

    使用 gdb 进入调试环境:

    gdb test
  • 设置断点

    使用 break 命令设置断点:

    (gdb) break main
  • 开始调试

    使用 start 命令开始执行:

    (gdb) start

    GDB 会停在 main 函数的第一行。

  • 单步调试

    使用 next 命令逐行执行:

    (gdb) next

    或跳转到 fib 函数:

    (gdb) step fib
  • 检查循环问题

    使用 backtrace 查看堆栈信息,发现 fib 函数被多次调用。

  • 修复程序

    fib 函数中添加参数检查:

    if (n < 0) return 0;

  • 示例 2:断点调试

    问题描述

    一个程序在第一次运行时正常,但第二次运行时输出错误。通过断点调试找到问题所在。

    int main(void) {    int sum = 0, i = 0;    char input[5];    while (1) {        printf("输入: ");        scanf("%s", input);        for (i = 0; input[i] != '\0'; i++) {            sum = sum * 10 + input[i] - '0';        }        printf("输出:%d\n", sum);    }    return 0;}

    调试过程

  • 设置断点

    使用 break 命令设置断点:

    (gdb) break main

    或在循环开始处设置断点:

    (gdb) break while
  • 运行程序

    使用 run 命令开始执行:

    (gdb) run

    由于断点设置在 main 函数的入口处,程序会暂停在断点处。

  • 观察程序执行

    使用 next 命令继续执行,直到触发断点。

  • 分析问题

    观察到第二次输入时,sum 变量没有被重置,导致错误。

  • 修复程序

    在循环开始处重置 sum

    sum = 0;

  • 示例 3:观察点调试

    问题描述

    程序中一个数组可能被其他变量共享,导致数据污染。使用观察点追踪数组访问情况。

    int main(void) {    int sum = 0, i = 0;    char input[5];    while (1) {        sum = 0;        scanf("%s", input);        for (i = 0; input[i] != '\0'; i++) {            sum = sum * 10 + input[i] - '0';        }        printf("input=%d\n", sum);    }    return 0;}

    调试过程

  • 设置观察点

    使用 watch 命令设置观察点:

    (gdb) watch input[5]
  • 运行程序

    使用 run 命令开始执行:

    (gdb) run
  • 观察结果

    发现 input[5] 被多次修改,且与 i 变量共享同一内存地址。

  • 修复程序

    使用 scanf_sfgets 替换 scanf,确保输入安全。


  • 常用的 GDB 命令

    1. 查看堆栈信息

    bt

    2. 继续执行程序

    continue

    3. 查看当前栈帧

    frame

    4. 查看局部变量

    info

    5. 列出源代码

    list

    6. 设置断点

    break

    7. 跳转到函数

    step

    8. 删除断点

    delete breakpoints

    9. 禁用断点

    disable

    10. 恢复断点

    enable

    通过以上方法,开发者可以有效地使用 GDB 调试程序,定位错误并快速修复问题。

    转载地址:http://wwso.baihongyu.com/

    你可能感兴趣的文章
    Netty源码—7.ByteBuf原理四
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    Objective-C实现binary exponentiation二进制幂运算算法(附完整源码)
    查看>>
    Objective-C实现hardy ramanujana定理算法(附完整源码)
    查看>>
    Objective-C实现insertion sort插入排序算法(附完整源码)
    查看>>
    Objective-C实现Interpolation search插值查找算法(附完整源码)
    查看>>
    Objective-C实现k-nearest算法(附完整源码)
    查看>>
    Objective-C实现KPCA(附完整源码)
    查看>>
    Objective-C实现max subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现md5算法(附完整源码)
    查看>>
    Objective-C实现miller rabin米勒-拉宾素性检验算法(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现perfect cube完全立方数算法(附完整源码)
    查看>>
    Objective-C实现segment tree段树算法(附完整源码)
    查看>>
    Objective-C实现SinglyLinkedList单链表算法(附完整源码)
    查看>>
    Objective-C实现三次样条曲线(附完整源码)
    查看>>
    Objective-C实现二进制补码算法(附完整源码)
    查看>>
    Objective-C实现删除重复的字母字符算法(附完整源码)
    查看>>
    Objective-C实现单例模式(附完整源码)
    查看>>
    Objective-C实现单向链表的反转(附完整源码)
    查看>>