GDB调试正在执行的程序——调试窗口与执行窗口分离

在某些情况下,我们可能想调试一个当前已经启动的程序,但又不想重启该程序,就可以借助 GDB 调试器实现。也就是说,GDB 可以调试正在运行的 C、C++ 程序。要知道,每个 C 或者 C++ 程序执行时,操作系统会使用 1 个(甚至多个)进程来运行它,并且为了方便管理当前系统中运行的诸多进程,每个进程都配有唯一的进程号(PID)。

如果需要使用 GDB 调试正在运行的 C、C++ 程序,需要事先找到该程序运行所对应的进程号。查找方式很简单,执行如下命令即可:

pidof  文件名

比如,我们将上节创建的 main.c 源文件修改为:

#include <stdio.h>

int main()
{
    int num = 1;
    while(1)
    {
        num++;
    }
    
    return 0;
}

执行 gcc main.c -o main.exe -g 编译指令,获得该源程序对应的具备调试信息的 main.exe 可执行文件,并在此基础上执行:

[root@bogon demo]# ./main.exe
        <--程序一直运行


显然,程序中存在死循环,它会一直执行。此时,借助 pidof 指令即可获取它对应的进程号:

[root@bogon demo]# pidof main.exe
1830

可以看到,当前正在执行的 main.exe 对应的进程号为 1830。在此基础上,可以调用 GDB 对该程序进行调试,调用指令有以下 3 种形式:

1) gdb attach PID
2) gdb 文件名 PID
3) gdb -p PID

其中,PID 指的就是要调取的程序对应的进程号。以调试进程号为 1830 的程序为例,执行如下指令:

[root@bogon demo]# gdb -p 1830
GNU gdb (GDB) 8.0.1
Copyright (C) 2017 Free Software Foundation, Inc.
......  <-- 省略部分输出信息
0x00005645319c613c in main () at main.c:6
6         num++;

注意,当 GDB 调试器成功连接到指定进程上时,程序执行会暂停。如上所示,程序暂停至第 6 行代码 num++ 的位置,此时可以通过断点调试、逐步运行等方式监控程序的执行过程。例如:

(gdb) l     <-- 查看源码以及各行行号
1 #include<stdio.h>
2 int main()
3 {
4     int num = 1;
5     while(1){
6         num++;
7     }
8     return 0;
9 }
(gdb) b 6      <--在程序第 6 行代码处打断点
Breakpoint 1 at 0x5645319c6138: file main.c, line 6.
(gdb) c         <--令程序进行执行,其会在下一个断点处停止
Continuing.

Breakpoint 1, main () at main.c:6
6         num++;
(gdb) p num         <-- 查看当前 num 的值
$2 = 47100335

注意,当调试完成后,如果想令当前程序进行执行,消除调试操作对它的影响,需手动将 GDB 调试器与程序分离,分离过程分为 2 步:

执行 detach 指令,使 GDB 调试器和程序分离;
执行 quit(或 q)指令,退出 GDB 调试。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

denglin12315

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值