GDB 的简单用法

一直以来调试都是使用printf(...)

感觉也挺方便的,设置断点什么的也不见得多好

但既然自己不会,就学习一下吧

先上一份简单的代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;

int ave(int a[], int n) {
    int tmp = 0;
    for(int i=0; i<n; ++i)
        tmp += a[i];
    tmp /= n;
    return tmp;
}

int main(void) {
    int x;
    int a[] = {1, 2, 3, 4, 5};
    x += 10;
    x -= 5;

    printf("x = %d\n", x);

    int tmp = ave(a, 5);
    printf("tmp = %d\n", tmp);
}

教程开始!

首先需要安装gdb

用linux的一般都有吧

但还是说一下吧,用下面指令来安装gdb

sudo apt-get install gdb


安装完成后,编译上面的代码

注意这里的编译要加上-g表明生成调试信息

也即:

g++ -g test.cpp -o test

接下来就可以使用:

gdb test

调试了,当然也可以直接gdb,接着再file [文件名]导入

使用l来显示源代码

首先设置断点

使用:b + 行号|函数名

在这里我们对第6、10、18、20行设置断点

即:



接着用r指令运行:


显示停在了第19行

我们可以使用p + 变量名来查看变量值

比如:


再使用c指令执行到下一个断点

因此我们可以使用这几个简单指令的配合来完成简单调试

指令d表示删除所有断点

最后我们也可以使用gdb -tui test来使用图形界面调试


### Linux GDB 使用教程及调试命令 GDB(GNU Debugger)是 Linux 和 Unix 系统中广泛使用的强大调试工具,能够帮助开发者在程序执行时查看和控制程序的行为,从而定位和修复错误[^2]。以下是关于 GDB 的使用方法及调试命令的详细介绍。 #### 1. 启动 GDB 要启动 GDB 并加载需要调试的程序,可以使用以下命令: ```bash gdb <program_name> ``` 如果需要调试带有参数的程序,可以在启动 GDB 后使用 `run` 命令并附加参数: ```bash (gdb) run arg1 arg2 ``` #### 2. 设置断点 断点是调试过程中非常重要的功能,允许程序在特定位置暂停执行以便进行检查。 - 在指定行号设置断点: ```bash (gdb) break <line_number> ``` - 在函数入口处设置断点: ```bash (gdb) break <function_name> ``` - 在所有线程中为特定代码行设置断点: ```bash (gdb) break thread_test.c:123 thread all ``` #### 3. 控制程序执行 GDB 提供了多种命令来控制程序的执行流程。 - 开始或重新开始程序执行: ```bash (gdb) run ``` - 单步执行当前行代码(进入函数内部): ```bash (gdb) step ``` - 单步执行当前行代码(不进入函数内部): ```bash (gdb) next ``` - 继续执行直到下一个断点: ```bash (gdb) continue ``` - 修改程序执行顺序(跳跃执行): ```bash (gdb) jump <line_number> ``` #### 4. 查看变量和内存 - 查看变量的值: ```bash (gdb) print <variable_name> ``` - 查看内存地址的内容: ```bash (gdb) x/<format> <address> ``` 例如,查看以十六进制格式显示的内存内容: ```bash (gdb) x/10xw <address> ``` #### 5. 多线程调试 GDB 支持多线程程序的调试,提供了以下相关命令: - 列出所有线程: ```bash (gdb) info threads ``` - 切换到指定线程: ```bash (gdb) thread <thread_ID> ``` - 让所有线程执行某个 GDB 命令: ```bash (gdb) thread apply all <command> ``` #### 6. 结束调试会话 当调试完成后,可以使用以下命令退出 GDB: ```bash (gdb) quit ``` 如果存在正在运行的子进程,系统会提示是否终止该进程[^4]。 #### 示例代码调试 假设有一个简单的 C 程序 `example.c`,编译时需要加上 `-g` 参数以包含调试信息: ```bash gcc -g example.c -o example ``` 然后启动 GDB 并加载程序: ```bash gdb example ``` 在程序中设置断点并运行: ```bash (gdb) break main (gdb) run ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值