调试工具_gdb使用教程

这篇具有很好参考价值的文章主要介绍了调试工具_gdb使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一. 环境介绍

二. gdb指令

1. 启动调试

2. 退出调试

3. 查看代码 

4. 运行程序

 5. 打断点

6. 查看断点

7.  删除断点

8.  逐过程调试

9. 逐语句调试

10.  查看变量

11. 常显示变量(监视)

12. 取消常显示变量

13. 运行到指定行

14. 执行完当前函数的剩余部分

15. 执行到下一个断点

16. 关闭断点

17. 开启断点

18. 不同文件中打断点

19. 查看局部变量

20. 修改变量的值

21. 查看函数的调用堆栈


GDB(GNU调试器)是一个功能强大的调试工具,提供了很多命令用于调试程序。下面我们来看一下如何使用gdb调试。

一. 环境介绍

我们要知道我们的程序有两种,一种是release 还有一种是 debug 版本的,我们的调试只有咋 debug 版本下才可以调试,我们只需要在编译的时候在后面加 -g 选项就是添加调试信息,也就是debug 版本。

二. gdb指令

下面我们就来看一下我们的 gdb 的指令

测试程序:

#include<stdio.h>


int addToToop(int top)
{
  int ret = 0;
  for(int i = 1; i <= top; ++i)
    ret += i;

  return ret;
}


int main()
{
  printf("开始调试\n");
  int sum = 20;
  int ret =  addToToop(sum);
  printf("%d\n", ret);
  printf("结束调试\n");
  return 0;
}

1. 启动调试

指令:gdb + 可执行程序文件名

[lxy@hecs-165234 test9]$ gdb test_debug 
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
Copyright (C) 2013 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/>...
Reading symbols from /home/lxy/test/test9/test_debug...done.
(gdb) 

 如果变成上面这样那么就以及成功了

2. 退出调试

指令:quit / q

(gdb) quit
[lxy@hecs-165234 test9]$ 
 


(gdb) q
[lxy@hecs-165234 test9]$ 

3. 查看代码 

指令:list / l  (后面也可以加 数字 表示查看该行和上下行的部分代码)

(gdb) l
10    
11      return ret;
12    }
13    
14    
15    
16    
17    int main()
18    {
19      printf("开始调试\n");
(gdb) l 0
1    #include<stdio.h>
2    
3    
4    
5    int addToToop(int top)
6    {
7      int ret = 0;
8      for(int i = 1; i <= top; ++i)
9        ret += i;
10    
(gdb) 

gdb 会记住上一次的指令,所以我们在查看的时候我们可以 l 0 然后之一回车

指令: l + 函数名(显示函数代码)

(gdb) l addToToop
1    #include<stdio.h>
2    
3    
4    
5    int addToToop(int top)
6    {
7      int ret = 0;
8      for(int i = 1; i <= top; ++i)
9        ret += i;
10    
(gdb) 
11      return ret;
12    }
13    
14    
15    
16    
17    int main()
18    {
19      printf("开始调试\n");
20      int sum = 20;
(gdb) 

4. 运行程序

指令:run / r

(gdb) r
Starting program: /home/lxy/test/test9/test_debug 
开始调试
210
结束调试
[Inferior 1 (process 7520) exited normally]
Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.x86_64
(gdb) 

 5. 打断点

指令:break / b 后面 + 行号

(gdb) break 21
Breakpoint 1 at 0x4005c4: file test.c, line 21.
(gdb) b 22
Breakpoint 2 at 0x4005d1: file test.c, line 22.
(gdb) 

6. 查看断点

指令:info  breakpoints / info b / i b

(gdb) info breakpoints
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
2       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
2       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
2       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
(gdb) 

 断点信息查看介绍:

  • NUM:断点编号
  • Type:断点类型
  • Disp:....
  • Enb:断点是否有效(可以将断点设置为无效)
  • 后面的就不做介绍了

7.  删除断点

指令:delete / d + 断点编号

(gdb) i b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
2       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
(gdb) delete 1
(gdb) i b
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
(gdb) d 2
(gdb) i b
No breakpoints or watchpoints.
(gdb) 

8.  逐过程调试

指令:next / n

我们先将断点打到 20 行的位置,然后我们开始逐语句调试

(gdb) b 20
Breakpoint 3 at 0x4005bd: file test.c, line 20.
(gdb) r
Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 3, main () at test.c:20
20      int sum = 20;
(gdb) n
21      int ret =  addToToop(sum);
(gdb) n
22      printf("%d\n", ret);
(gdb) n
210
23      printf("结束调试\n");
(gdb) n
结束调试
24      return 0;
(gdb) n
25    }
(gdb) n
0x00007ffff7a2f555 in __libc_start_main () from /lib64/libc.so.6
(gdb) n

9. 逐语句调试

指令:step / s

我们还是在 20 行的位置打断点,然后我们逐语句调试,我们会进入到函数里面

(gdb) r
Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 3, main () at test.c:20
20      int sum = 20;
(gdb) s
21      int ret =  addToToop(sum);
(gdb) s
addToToop (top=20) at test.c:7
7      int ret = 0;
(gdb) s
8      for(int i = 1; i <= top; ++i)
(gdb) s
9        ret += i;
(gdb) 

10.  查看变量

指令:print / p + 变量名

Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 3, main () at test.c:20
20      int sum = 20;
(gdb) print sum
$4 = 0
(gdb) n
21      int ret =  addToToop(sum);
(gdb) print sum
$5 = 20
(gdb) p sum
$6 = 20
(gdb) 

11. 常显示变量(监视)

指令:display + 变量名

我们将断点打到 21 行(函数所在行),然后我们 s 进入函数, 我们 display 查看变量 i 

Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 4, main () at test.c:21
21      int ret =  addToToop(sum);
(gdb) s
addToToop (top=20) at test.c:7
7      int ret = 0;
(gdb) n
8      for(int i = 1; i <= top; ++i)
(gdb) display i
1: i = 4195472
(gdb) n
9        ret += i;
1: i = 1
(gdb) n
8      for(int i = 1; i <= top; ++i)
1: i = 1
(gdb) n
9        ret += i;
1: i = 2
(gdb) 

我们的常显示变量的前面还有一个数字,这个就是常显示变量的 编号 

12. 取消常显示变量

指令:undisplay + 常显示变量的编号

还是根据上面的 显示 i 变量,然后我们取消显示 i 变量 

1: i = 2
(gdb) undisplay 1
(gdb) 

13. 运行到指定行

这次我们在进入到 函数中去 然后我们使用指令到指定行

指令:until + 行号

开始调试

Breakpoint 4, main () at test.c:21
21      int ret =  addToToop(sum);
(gdb) s
addToToop (top=20) at test.c:7
7      int ret = 0;
(gdb) s
8      for(int i = 1; i <= top; ++i)
(gdb) until 11
addToToop (top=20) at test.c:11
11      return ret;
(gdb) 
 

14. 执行完当前函数的剩余部分

我们继续到 该函数中去

指令:finish(执行完当前函数剩余的所有代码,并且在下一个函数执行前一行停止)

(gdb) run
Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 4, main () at test.c:21
21      int ret =  addToToop(sum);
(gdb) s
addToToop (top=20) at test.c:7
7      int ret = 0;
(gdb) s
8      for(int i = 1; i <= top; ++i)
(gdb) finish
Run till exit from #0  addToToop (top=20) at test.c:8
0x00000000004005ce in main () at test.c:21
21      int ret =  addToToop(sum);
Value returned is $8 = 210
(gdb) 

15. 执行到下一个断点

我们多打几个断点 20 21 22 ,然后我们 continue

指令:continue

(gdb) i b
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
    breakpoint already hit 1 time
(gdb) b 20
Breakpoint 5 at 0x4005bd: file test.c, line 20.
(gdb) b 22
Breakpoint 6 at 0x4005d1: file test.c, line 22.
(gdb) i b
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
    breakpoint already hit 1 time
5       breakpoint     keep y   0x00000000004005bd in main at test.c:20
6       breakpoint     keep y   0x00000000004005d1 in main at test.c:22

断点打好了


(gdb) run
Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 5, main () at test.c:20
20      int sum = 20;
(gdb) continue
Continuing.

Breakpoint 4, main () at test.c:21
21      int ret =  addToToop(sum);
(gdb) continue
Continuing.

Breakpoint 6, main () at test.c:22
22      printf("%d\n", ret);
(gdb) continue
Continuing.
210
结束调试
[Inferior 1 (process 7634) exited normally]
(gdb) 

16. 关闭断点

指令:disable + 断点编号

我们现在有 20 21 22 三个断点,我们现在关闭掉 21 我们 i b 查看一下

(gdb) i b
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
    breakpoint already hit 1 time
5       breakpoint     keep y   0x00000000004005bd in main at test.c:20
    breakpoint already hit 1 time
6       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
    breakpoint already hit 1 time
(gdb) disable 4
(gdb) i b
Num     Type           Disp Enb Address            What
4       breakpoint     keep n   0x00000000004005c4 in main at test.c:21
    breakpoint already hit 1 time
5       breakpoint     keep y   0x00000000004005bd in main at test.c:20
    breakpoint already hit 1 time
6       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
    breakpoint already hit 1 time
(gdb) 

17. 开启断点

指令:enable + 断点编号

(gdb) i b
Num     Type           Disp Enb Address            What
4       breakpoint     keep n   0x00000000004005c4 in main at test.c:21
    breakpoint already hit 1 time
5       breakpoint     keep y   0x00000000004005bd in main at test.c:20
    breakpoint already hit 1 time
6       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
    breakpoint already hit 1 time
(gdb) enable 4
(gdb) i b
Num     Type           Disp Enb Address            What
4       breakpoint     keep y   0x00000000004005c4 in main at test.c:21
    breakpoint already hit 1 time
5       breakpoint     keep y   0x00000000004005bd in main at test.c:20
    breakpoint already hit 1 time
6       breakpoint     keep y   0x00000000004005d1 in main at test.c:22
    breakpoint already hit 1 time
(gdb) 

18. 不同文件中打断点

指令:break / b + 文件名 + :+ 行号

这里就不做演示了....(没有多个文件)

19. 查看局部变量

指令:info locals / i locals

我们打断点到 22 行,然后我们查看主函数里面的变量

(gdb) run
Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 7, main () at test.c:22
22      printf("%d\n", ret);
(gdb) info locals
sum = 20
ret = 210
(gdb) i locals
sum = 20
ret = 210
(gdb) 

20. 修改变量的值

指令:set var + (变量名 = 值)

我们到 21 行里面的函数里面,然后直接修改i的值为200,然后查看 i 的值

(gdb) run 
Starting program: /home/lxy/test/test9/test_debug 
开始调试

Breakpoint 8, main () at test.c:21
21      int ret =  addToToop(sum);
(gdb) s
addToToop (top=20) at test.c:7
7      int ret = 0;
(gdb) s
8      for(int i = 1; i <= top; ++i)
(gdb) p i
$13 = 4195472
(gdb) set var i = 200
(gdb) p i
$14 = 200
(gdb) 

21. 查看函数的调用堆栈

指令:bt

我们先到 mian 函数里面查看调用堆栈,然后在进入到我们自己写的函数的里面继续查看调用堆栈,然后我们在 finish 结束掉我们自己的函数,然后查看调用堆栈

(gdb) run 
Starting program: /home/lxy/test/test9/test_debug 

Breakpoint 9, main () at test.c:19
19      printf("开始调试\n");
(gdb) bt
#0  main () at test.c:19
(gdb) s
开始调试
20      int sum = 20;
(gdb) s
21      int ret =  addToToop(sum);
(gdb) s
addToToop (top=20) at test.c:7
7      int ret = 0;
(gdb) s
8      for(int i = 1; i <= top; ++i)
(gdb) bt
#0  addToToop (top=20) at test.c:8
#1  0x00000000004005ce in main () at test.c:21

(gdb) s
9        ret += i;
(gdb) finish
Run till exit from #0  addToToop (top=20) at test.c:9
0x00000000004005ce in main () at test.c:21
21      int ret =  addToToop(sum);
Value returned is $15 = 210
(gdb) bt
#0  0x00000000004005ce in main () at test.c:21
(gdb) 

上面的就是 gdb 里面常用的命令,我们下期见~ 文章来源地址https://www.toymoban.com/news/detail-550176.html

到了这里,关于调试工具_gdb使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux: GDB 调试工具

      目录 概念: Linux 下 debug 和 release 的区别: GDB 的使用 :  激活和进入工作模式:  查看文件的内容: 运行调试的文件:  打断点:   查看断点: 删除断点: 禁用断点: ​编辑 重新打开断点:  逐过程 与 逐语句: 查看变量/监视功能:  常显示:  运行至下一个断点

    2024年02月19日
    浏览(38)
  • 【linux】git和gdb调试工具

    这两个步骤用于识别提交代码的身份,一个你的名字,一个你的邮箱 开启本地仓库 克隆本地仓库成功 我们将这个仓库拷到了111目录底下. 我们发现少了一个.gitignore,因为.gitignore是隐藏文件,所以使用ls -la查看 用于查看提交状态 上面可以看到提交人的信息,以及时间,以及提

    2024年02月22日
    浏览(35)
  • Linux的调试工具 - gdb(超详细)

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项,发布成debug模式 注: 如果没有断点,程序将运行到底 注: 单条执行需要在调试启动的情况下进行,需要先打断点

    2024年02月07日
    浏览(33)
  • Linux开发工具之调试器gdb

    程序的发布方式有两种,debug模式和release模式 Linux gcc/g++出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项   所以一份代码若要被调试必须是debug模式,但是在linux下我们编译代码的时候默认为release模式,要想让我们的代码

    2024年02月07日
    浏览(42)
  • Linux中的C/C++语言调试工具 GDB

    GDB(GNU Debugger)是一个功能强大的调试器,用于调试和分析程序的执行过程。它是GNU项目的一部分,可以在多个操作系统上使用,包括Linux、Unix和Windows。 GDB主要用于调试编译后的 可执行文件 ,它可以帮助程序开发人员识别和修复代码中的错误、追踪程序的执行流程、观察和

    2024年02月08日
    浏览(73)
  • 【Linux操作系统】深入了解系统编程gdb调试工具

    在软件开发过程中,调试是一个非常重要的步骤。无论是在开发新的软件还是维护现有的代码,调试都是解决问题的关键。对于Linux开发者来说,GDB是一个非常有用的调试工具。在本文中,我们将探讨Linux中使用GDB进行调试的方法和技巧。 GDB是GNU调试器的缩写,是一个功能强

    2024年02月14日
    浏览(44)
  • Linux | 调试器GDB的详细教程【纯命令行调试】

    学习了【vim】知道了如何 编辑 一个代码文本 学习了【gcc】知道了如何 编译 一个代码文本 学习了【make/Makefile】知道了如何 自动化构建 一个代码文本 但是如何对一段代码去进行调试呢,此时就要使用到 Linux下的调试器gdb 了。对于这个调试器来说,不像是VS中那样的图形化界

    2024年02月02日
    浏览(52)
  • [linux开发工具]小程序--进度条、调试器 - gdb

    📙 作者简介 :RO-BERRY 📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持 第一种情况 执行结果如下: 可以看到程序先执行printf再执行sleep 第二种情况 执行结果如下: 在这里

    2024年02月22日
    浏览(43)
  • Linux工具【2】(调试器gdb、项目自动化构建工具make/Makefile)

    在上一篇文章中介绍了Linux中的编辑器vim与编译器gcc与g++: 戳我看vim与gcc详解哦 在本篇文章中将继续来介绍Linux中的工具: 调试器gdb与项目自动化构建工具make/Makefile 在Windows环境中,我们使用vs时,常常会逐过程与逐语句地调试代码以更高效地寻找到错误的位置。在Linux中也

    2024年02月12日
    浏览(49)
  • Linux系统下的程序调试工具——GDB(GNU Debugger)

    GCC(GNU Compiler Collection)是GNU开发的编程语言编译器,它支持多种编程语言,如C、C++、Objective-C、Fortran、Ada和Go等。 以下是一些常用的操作: 启动GDB并加载程序 设置断点 在代码中的某一行设置断点,当程序运行到这一行时,GDB会暂停执行。 例如,如果你在 main.c 文件的第

    2024年04月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包