(四)GDB调试

1 什么是GDB

  • GDB 是由 GNU 软件系统社区提供的调试工具,同 GCC 配套组成了一套完整的开发环境,GDB 是 Linux 和许多类 Unix 系统中的标准开发环境。
  • 一般来说,GDB 主要帮助你完成下面四个方面的功能:
    1. 启动程序,可以按照自定义的要求随心所欲的运行程序
    2. 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
    3. 当程序被停住时,可以检查此时程序中所发生的事
    4. 可以改变程序,将一个 BUG 产生的影响修正从而测试其他 BUG

2 准备工作

  • 通常,在为调试而编译时,我们会关掉编译器的优化选项(-O), 并打开调试选项(-g)。另外,-Wall在尽量不影响程序行为的情况下选项打开所有warning,也可以发现许多问题,避免一些不必要的 BUG。
  • gcc -g -Wall program.c -o program
  • -g 选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证 gdb 能找到源文件。

分别执行以下两条命令,可以发现test文件比test1文件大,是因为添加了源代码信息。
gcc -g test.c -o test gcc test.c -o test1

root@LDY:~/cpp-study/lesson08# ll -h test test1
-rwxr-xr-x 1 root root 20K Oct 22 14:10 test*
-rwxr-xr-x 1 root root 17K Oct 22 14:12 test1*

3 启动、退出、查看代码

  • 启动和退出
    gdb 可执行程序
    quit/q 退出程序

  • 给程序设置参数/获取设置参数
    set args 10 20
    show args

  • GDB 使用帮助
    help

  • 查看当前文件代码
    list/l (从默认位置显示)
    list/l 行号 (以指定的行号为中心显示)
    list/l 函数名(以指定的函数为中心显示)

  • 查看非当前文件代码
    list/l 文件名:行号
    list/l 文件名:函数名

  • 设置显示的行数
    show list/listsize
    set list/listsize 行数

4 断点操作

  • 设置断点
    b/break 行号
    b/break 函数名
    b/break 文件名:行号
    b/break 文件名:函数

  • 查看断点
    i/info b/break

  • 删除断点
    d/del/delete 断点编号

  • 设置断点无效
    dis/disable 断点编号

  • 设置断点生效
    ena/enable 断点编号

  • 设置条件断点(一般用在循环的位置)
    b/break 10 if i==5

当前文件打断点:

(gdb) break 9
Breakpoint 1 at 0x137b: file main.cpp, line 9.
(gdb) b main
Breakpoint 2 at 0x133d: file main.cpp, line 6.

其他文件打断点:

(gdb) b bubble.cpp:11
Breakpoint 3 at 0x125b: file bubble.cpp, line 11.
(gdb) b bubble.cpp:bubbleSort
Breakpoint 4 at 0x11e9: file bubble.cpp, line 6

断点信息:

(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000000137b in main() at main.cpp:9
2       breakpoint     keep y   0x000000000000133d in main() at main.cpp:6
3       breakpoint     keep y   0x000000000000125b in bubbleSort(int*, int) at bubble.cpp:11
4       breakpoint     keep y   0x00000000000011e9 in bubbleSort(int*, int) at bubble.cpp:6

删除断点:

(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000000137b in main() at main.cpp:9
2       breakpoint     keep y   0x000000000000133d in main() at main.cpp:6
3       breakpoint     keep y   0x000000000000125b in bubbleSort(int*, int) at bubble.cpp:11

断点失效:

(gdb) disable 3
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000000137b in main() at main.cpp:9
2       breakpoint     keep y   0x000000000000133d in main() at main.cpp:6
3       breakpoint     keep n   0x000000000000125b in bubbleSort(int*, int) at bubble.cpp:11

断点生效:

(gdb) enable 3
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000000137b in main() at main.cpp:9
2       breakpoint     keep y   0x000000000000133d in main() at main.cpp:6
3       breakpoint     keep y   0x000000000000125b in bubbleSort(int*, int) at bubble.cpp:11

条件断点:

(gdb) break 16 if i=3
Breakpoint 5 at 0x13b5: file main.cpp, line 16.
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x000000000000137b in main() at main.cpp:9
2       breakpoint     keep y   0x000000000000133d in main() at main.cpp:6
3       breakpoint     keep y   0x000000000000125b in bubbleSort(int*, int) at bubble.cpp:11
5       breakpoint     keep y   0x00000000000013b5 in main() at main.cpp:16
        stop only if i=3

5 调试命令

  • 运行GDB程序
    start(程序停在第一行)
    run(遇到断点才停)

  • 继续运行,到下一个断点停
    c/continue

  • 向下执行一行代码(不会进入函数体)
    n/next

  • 变量操作
    p/print 变量名(打印变量值)
    ptype 变量名(打印变量类型)

  • 向下单步调试(遇到函数进入函数体)
    s/step
    finish(跳出函数体)

  • 自动变量操作
    display 变量名(自动打印指定变量的值)
    i/info display
    undisplay 编号

  • 其它操作
    set var 变量名=变量值 (循环中用的较多)
    until (跳出循环)

    跳出循环要先删除循环内的断点或其实失效

posted @   DaleLee  阅读(101)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示