首页 > 其他分享 >(四)GDB调试

(四)GDB调试

时间:2022-10-22 17:11:47浏览次数:46  
标签:gdb keep GDB breakpoint cpp main 断点 调试

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 (跳出循环)

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

标签:gdb,keep,GDB,breakpoint,cpp,main,断点,调试
From: https://www.cnblogs.com/dalelee/p/16815995.html

相关文章

  • 开发调试ldd
    https://mp.weixin.qq.com/s?__biz=MzI2OTA3NTk3Ng==&mid=2649283850&idx=1&sn=6a23eebca91d9071f3963c1e5a90ab28&chksm=f2f9ae6dc58e277b2899bd67d475c6d8928bb5d7726558......
  • Dev-C++ 动态调试功能
    Dev动态调试今天发现了Dev还有这个功能,感觉十分神奇,于是记录一下设置要想使用动态调试,我们必须要先打开"产生调试信息"选项这是我们的页面,这是可以看到上方有一行......
  • c语言—调试篇—笔记
    调试#include<stdio.h>intmain(){char*p="hellobit.";printf("%s\n",p);return0;}#include<stdio.h>intmain(){inti=0;intarr[10]={0};for(i=0;i<=12;i++......
  • .net core 配置Swagger 摆脱PostMan,你值得拥有这样的api调试方式
    废话不多说直接来看第一步:安装nuget包:Swashbuckle.AspNetCore.Swagger            Swashbuckle.AspNetCore.SwaggerGen         ......
  • 黑盒变白盒 - 调试 Red5 项目时查看 Red5 容器内部运行机制
        《​​如何使用Red5插件创建Red5项目?​​​》介绍了如何在Eclipse下创建并调试Red5项目。有同学问,“我想在调试Red5应用程序......
  • 《Apache MINA 2.0 用户指南》第十三章:调试
        第十三章起是MINA的高级主题部分,一直到最后一章(第十七章),将对调试、状态机、代理、JMX集成、Spring集成等主题进行详细讨论。 ......
  • C++调用C#DLL并调试
    使用C++来调用C#DLL并且调试程序环境:使用VSstudio2019C#项目的设置1、C#->属性->应用程序->目标框架->.NETFramework42、C#->属性->调试->调试程......
  • 关于gdb调试
    ①gcctest.c-otest-g(生成所需文件)②gdbtest(进入gdb模式)③setargsab(设置参数a,b,空格隔开)④showargs(获取所设置的参数)⑤使用q或quit退出gdb模式 gdb模式下的......
  • 调试遇到的一些问题记录【持续记录】
    1.std::vector作为入参,跨dll传输引起的崩溃问题崩溃现象:监控传入的std变量:在dll外部时,std::vector_Myval2为std_Container_base0,在dll内部时,std::vector_Myval2为std_Con......
  • Java调试排错心得
      首先这里没有报错,但是打印了四行相同的数据,还都是最后一行的数据。然后调试了一下这里是重点:  下面哪里account={Account@1580}是一直用的一个对象,所有每一次......