GDB 使用教程

GDB (GNU Debugger)是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。GDB中的命令固然很多,但我们只需掌握其中十个左右的命令,就大致可以完成日常的基本的程序调试工作。

下面我们从一个实例出发,详述 Linux 下 GDB 的调试过程。

#include <stdio.h>

int nGlobalVar = 0;

int tempFunction(int a, int b)
{
    printf("tempFunction is called, a = %d, b = %d /n", a, b);
    return (a + b);
}

int main()
{
    int n;
    n = 1;
    n++;
    n--;

    nGlobalVar += 100;
    nGlobalVar -= 12;

    printf("n = %d, nGlobalVar = %d /n", n, nGlobalVar);

    n = tempFunction(1, 2);
    printf("n = %d\n", n);

    return 0;
}

将上述代码保存到文件 gdb_sample.c 中,并用 gcc 编译之:

gcc gdb_sample.c -o gdb_sample -g
  • 使用 -o 参数指定了编译生成的可执行文件名为 gdb-sample,
  • 使用参数 -g 表示将源代码信息编译到可执行文件中。如果不使用参数 -g,会给后面的 GDB 调试造成不便。当然,如果我们没有程序的源代码,自然也无从使用 -g 参数,调试/跟踪时也只能是汇编代码级别的调试/跟踪。

下面“gdb”命令启动GDB,将首先显示GDB说明,不管它:

GNU gdb (GDB) Red Hat Enterprise Linux (7.2-60.el6)
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb)

上面最后一行“(gdb) ”为 GDB 内部命令引导符(command prompt),等待用户输入 GDB 命令。

  • (1)使用file命令载入被调试程序 gdb-sample

    这里的 gdb-sample 即前面 GCC 编译输出的可执行文件),也即 GDB 调试的是最终经过 gcc 编译的可执行文件(最后编译时加上 -g 参数):

    (gdb) file gdb_sample
    Reading symbols from /home/zhangchunhui/workspaces/C-C++/gdb_test/gdb_sample...done.

    上面最后一行提示已经加载成功;

  • (2)使用 r命令(run)执行被调试文件,

    因为尚未设置任何断点,将正常执行到程序结束;

    Reading symbols from /home/zhangchunhui/workspaces/C-C++/gdb_test/gdb_sample...done.
  • (3)下面使用 b 命令(breakpoint)在 main 函数开头设置一个断点,仅表示设置断点,就像 IDE 中在某一位置按下 F9。

    (gdb) b main
    Breakpoint 1 at 0x400510: file gdb_sample.c, line 12.
    • 上面最后一行提示已经成功设置断点,
    • 并给出了该断点信息:在源文件 gdb-sample.c 第 12 行处设置断点;
    • 这是本程序的第一个断点(序号为1);
    • 断点处的代码地址为 0x804835c(此值可能仅在本次调试过程中有效)。
  • (4)再次使用 r 命令执行(Run)被调试程序

    (gdb) r 
    Starting program: /home/zhangchunhui/workspaces/C-C++/gdb_test/gdb_sample 
    
    Breakpoint 1, main () at gdb_sample.c:12
    12  {
  • (5)下面使用 s 命令(Step)单步执行下一行代码

  • (6)使用p + 变量打印变量值

  • (7)分别在第 21 行、tempFunction 函数开头各设置一个断点(不仅支持行号,还支持符号名,这有赖于执行 gcc 编译时指定的 -g 参数)

    (gdb) b 21
    Breakpoint 2 at 0x40051a: file gdb_sample.c, line 21.
    (gdb) b tempFunction 
    Breakpoint 3 at 0x4004d0: file gdb_sample.c, line 6.
  • (8)使用c命令继续(Continue)执行被调试程序

  • (9)d:删除所有断点

    (gdb) d
    Delete all breakpoints? (y or n) y
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五道口纳什

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

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

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

打赏作者

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

抵扣说明:

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

余额充值