GDB常用指令

本文详细介绍了如何使用GDB进行C++程序的调试,包括设置断点、查看源码、单步执行、查看变量值、继续运行、调试被调用函数以及处理核心转储文件。此外,还讲解了在Linux环境下调试运行中的进程、多进程调试、调试线程以及如何挂起其他进程。内容覆盖了GDB的高级用法,对于提升调试效率和理解程序执行流程非常有帮助。
摘要由CSDN通过智能技术生成

// main.cpp

#include <iostream>
#include <vector>

using namespace std;

int32_t main(int argc, char const *argv[])
{
    cout << "hello world!" << endl;

    vector<int32_t> myList;
    for (int32_t i = 0; i < 10; i++) {
        myList.push_back(i);
    }

    for (auto it : myList) {
        cout << it << endl;
    }

    return 0;
}

1,生成可以使用GDB调试的可执行程序

g++ -g main.cpp -o main.exe

2,进入GDB调试模式

gdb main.exe

3,使用GDB查看二进制对应的源码

在gdb运行成功的前提下,输入l,可以一次查看10行源码,如果要继续查看,继续输入l。

4, 设置断点

在gdb运行成功的前提下,输入b 行号,进行插入断点。

eg:b 12

 5,运行程序

在gdb运行成功的前提下,输入r,让程序运行起来。发现程序停在了我们之前设置的断点处。

  6,单步运行

在gdb运行成功的前提下,输入r,让程序运行起来之后,可以使用n,单步运行程序。

  7,查看当前程序中的变量值

当程序运行停止到断点处时,或者单步调试运行的时候,可以使用print 变量名 ,查看变量的当前值和值的地址。

   8,继续运行代码

当程序停止到断点处时,输入c,可以使程序继续运行下一个断点处,没有更多断点的时候,则程序运行至结束。

 9,退出GDB调试模式

以下示例使用下面的代码

// main.cpp

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int32_t SaveData(const vector<int32_t>& data)
{
    set<int32_t> dataGroup;
    for (auto it : data) {
        dataGroup.insert(it);
    }

    return 0;
}

int32_t main(int argc, char const *argv[])
{
    cout << "hello world!" << endl;
    vector<int32_t> myList;
    
    for (int32_t i = 0; i < 10; i++) {
        myList.push_back(i);
    }

    auto ret = SaveData(myList);

    for (auto it : myList) {
        cout << it << endl;
    }

    return 0;
}

10,单步调试进被调用函数内部并且查看内部的值

进入GDB调试模式,并且加断点,运行至调用函数的地方,使用s,单步进入被调用函数,查看内部变量的值。

11,GDB中core的使用(在linux环境中)

使用 g++ -g test_error.cpp -o a.out,生成二进制可执行文件,并且运行,core dump文件在linux上生成。在使用gdb a.out core,就能看到错误的地方。

 12,GDB调试正在运行的进程(linux)

lnux中,可以使用指令ps -ef,查看当前系统中的所有运行中的进程PID,| 表示将所有进程的PID放入管道内使用grep查询,查询的时候使用目标进程的关键字。如本文中直接使用可执行二进制的文件名名称。查询时,该二进制程序必须处于运行状态。

 查询到该进程的PID之后,就可以使用 gdb -p 9078进入或者gdb a.out -p 9078进行调试。

 13,GDB多进程调试(linux)

在GDB调试模式下,有个follow-fork-mode,可通过show follow-fork-mode 查看当前GDB调试的调试进程,当前进程一般为父进程,如果在代码中设置断点,只能断住父进程的代码,子进程的代码将无阻塞运行。

通过set follow-fork-mode child 可将当前GDB的调试进程设置为子进程,同理如果在代码中设置断点,只能断住子进程的代码,父进程的代码将无阻塞运行。

 14,GDB调试当前进程,是否挂起其它进程(linux)

在GDB调试模式下,

show detach-on-fork  如果是on,表示调试当前进程时,其余进程可正常运行。

set detach-on-fork off  调试当前进程时,其他金次那个不运行。

15,查询当前正在调试的进程(linux)

使用 info inferiors查询当前进程,带*的为当前正在调试的进程。

需要切换GDB当前调试进程的时候,使用inferior num进行当前调试进程的切换,其中num为上图中的inferiors num。 

 16,调试多线程代码(linux)

进入GDB调试模式,使用info threads,查看当前线程,其中带*的为当前调试线程。

 切换当前调试线程,使用 thread Id,ID就是上图中thread Id号码。

  17,同时操作多个线程(linux)

使用 thread apply ID1 ID2 cmd,来同时操作多个线程执行同一个命令,或者可以使用thread apply all cmd,让当前所有线程执行同一个命令。

不断完善中。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值