目录

一.准备工作

二.调试命令

(一).查看代码内容(l)

(二).开始调试(r)

(三).查看当前调试位置(where)

(四).断点(b、info b、d、c、disable、enable)

1.打断点

2.显示断点

3.删除断点

4.调试至下一个断点

5.关闭断点

​编辑 6.打开断点

(五).打印变量和数组(p、display、undisplay)

1.打印某变量值

2.常显示某变量

3.删除常显示

(六).逐语句、逐过程调试(s、n)

1.逐语句调试(step)

2.逐过程调试(next)

(七).函数(bt、finish、until)

1.查看当前堆栈调用

2.直接跑完当前函数

3.执行至指定行

(八).反汇编(disassemble)

(九).在gdb界面执行linux指令(shell)

(十).退出gdb(quit)


一.准备工作

首先,我们需要将文件编译为debug版本。因为在linux系统下,默认生成的可执行程序是release版,但是调试需要debug版本。

我们需要在gcc或g++命令后加上限定符-g。这样生成的程序就是debug版本的。

方式如下:

gcc/g++ -g test.c/test.cpp -o test

二.调试命令

*gdp会自动记录最近的命令,如果没有输入其他命令,可以按enter键继续执行最近命令。

(一).查看代码内容(l)

l  命令是用来查看代码内容的。使用方式为

l 行号        默认生成10行,当指定行号时,会生成以指定行号为中间的共10行代码

默认不指定行号时:

(gdb) l
1   #include<iomanip>
2   #include<stdio.h>
3   #include<string.h>
4   #include<iostream>
5   #include<stdlib.h>
6   #include<unistd.h>
7   using namespace std;
8   int main()
9   {
10    char arr[102] = { 0  };
(gdb)

指定行号:

(gdb) l 10
5   #include<stdlib.h>
6   #include<unistd.h>
7   using namespace std;
8   int main()
9   {
10    char arr[102] = { 0  };#会以第10行为中心
11    const char* Lop = "|/-\\";
12    memset(arr, 0, sizeof(arr));
13    int i = 0;
14    for(i = 0; i <= 100; i++)
(gdb)

(二).开始调试(r)

r命令用来开始代码调试工作,使用方式如下:

r        开始调试,直到程序结束或遇到断点暂停。在调试过程中,再次使用r命令会重新开始调试。

(三).查看当前调试位置(where)

where        查看此时执行位置

(四).断点(b、info b、d、c、disable、enable)

1.打断点

b 行号        在指定行打断点

2.显示断点

info b        显示全部断点信息,也可以在b后加编号显示指定断点

(gdb) b 10  #打断点
Breakpoint 3 at 0x400ac8: file cdl.cpp, line 10.
(gdb) b 15
Breakpoint 4 at 0x400b23: file cdl.cpp, line 15.
(gdb) info b  #显示断点
Num     Type           Disp Enb Address            What
3       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:10
4       breakpoint     keep y   0x0000000000400b23 in main() at cdl.cpp:15
(gdb)

3.删除断点

d 断点编号        删除指定断点,不加编号则删除全部

注意断点编号不是行号,可以使用info来查看。

(gdb) info b
Num     Type           Disp Enb Address            What
5       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:7
6       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:10
7       breakpoint     keep y   0x0000000000400b23 in main() at cdl.cpp:15
8       breakpoint     keep y   0x0000000000400b39 in main() at cdl.cpp:17
(gdb) d 5   #删除指定断点
(gdb) d     #删除全部断点
Delete all breakpoints? (y or n) y
(gdb) info b
No breakpoints or watchpoints.
(gdb)

4.调试至下一个断点

c        从当前调试位置直接执行到下一个断点处

#断点为10、17、18行
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400ac8 in main() at cdl.cpp:10
2       breakpoint     keep y   0x0000000000400b39 in main() at cdl.cpp:17
3       breakpoint     keep y   0x0000000000400c04 in main() at cdl.cpp:20
(gdb) r  #执行到第10行暂停Breakpoint 1, main () at cdl.cpp:10
10    char arr[102] = { 0  };
(gdb) c   #执行到第17行暂停
Continuing.Breakpoint 3, main () at cdl.cpp:17
17      cout << '[' << setw(100) << arr << ']' << '[' << i << '%' << ']' << Lop[i % 4] << '\r';
(gdb)

5.关闭断点

disable 断点编号        关闭断点 

注意,关闭断点并不是删除断点。只是在调试时不会在该处暂停,但是断点依旧存在。

使用info b即可看断点关闭与否。

 6.打开断点

enable 变量编号        打开断点

同样的,指令需要输入的也是断点编号

(五).打印变量和数组(p、display、undisplay)

1.打印某变量值

p 变量        打印对应的变量值,打印地址直接加取地址符&即可

需要注意的是,这种方法只能显示一次变量值,当继续调试时变量不再显示。

(gdb) p i
$5 = 4
(gdb) n
14    for(i = 0; i <= 100; i++)
(gdb)     #变量i没有再次显示

如果我们需要打印数组的值,输入数组名即可。

2.常显示某变量

如果我们需要在调试中一直显示某个变量的值,那么就需要display命令了。

display 变量        常显示指定变量值,使用方式与p一致 

(gdb) display arr
3: arr = "---------", '\000' <repeats 92 times>
(gdb) c
Continuing.
[---------                                                                 ][9%]/
Breakpoint 1, main () at cdl.cpp:17
#arr数组常显示
3: arr = "----------", '\000' <repeats 91 times>
(gdb)

3.删除常显示

undisplay 常显示变量编号        删除指定常显示变量 

需要注意的是,不能直接写变量名,变量编号使用info display即可知道。

(六).逐语句、逐过程调试(s、n)

1.逐语句调试(step)

s        逐语句调试。相当于vs中的F11

2.逐过程调试(next)

n        逐过程调试。相当于vs中的F10 

(七).函数(bt、finish、until)

1.查看当前堆栈调用

bt        查看当前堆栈调用 

主要用于调试至函数内部或者递归调用函数时。

我们以一个递归程序举例:

#include<stdio.h>
void func(int i);
void func(int i)
{if(i == 0)  return;printf("hello world\n");func(i - 1);
}int main()                                                                                                      3 {                                                                                                                                              4   func(3);                                                                                                                                       5   return 0;                                                                                                      6 }           

当我们执行至i == 1时:

2.直接跑完当前函数

finish        可以直接跑完当前函数,若函数只有一层则直接跑完函数。 

如果是函数递归调用,当还没开始递归时,finish会执行完整个函数,自动走完全部递归过程(前提无断点)。

当已经递归调用后,在哪一层递归finish就会返回至它的前一层。

我们依旧以上一个递归程序为例:

3.执行至指定行

until 行号        执行至指定行

1    #include"head.h"
2    void func(int i)
3   {
4     if(i == 0)  return;
5     printf("hello world\n");
6     func(i-1);
7   }
(gdb) until 5
func (i=3) at function.c:5
5     printf("hello world\n");
1: i = 3
(gdb)

until也可以在main函数中使用,但一般until用于小范围跳动。

(八).反汇编(disassemble)

disassemble        查看指令附近区域的反汇编

(九).在gdb界面执行linux指令(shell)

shell 指令        在gdb界面中执行linux指令

(十).退出gdb(quit)

(gdb) quit

(gdb) quit
A debugging session is active.Inferior 1 [process 10341] will be killed.Quit anyway? (y or n) y
[cdl@VM-16-9-centos ~]$
  • “一名优秀的程序员,在穿越单行道时也会确认双向的来车情况。”——道格拉斯·林德(Doug Linder)

如有错误,敬请斧正

linux—常用gdb调试命令汇总相关推荐

  1. Linux C : GDB调试命令汇总

    GDB 是GNU的一个交互式调试工具,可以调试C.C++ 和其他几种语言编写的程序 利用  gcc   -g   [源文件列表]  -o  [调试文件.x]  来生成调试文件 生成调试文件后   gd ...

  2. 收藏 | Linux常用156个命令汇总!

    来源:机器学习算法与Python学习 本文约2500字,建议阅读5分钟. 本文为大家带来Linux系统中156个常用的命令. linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无 ...

  3. Linux常用的shell命令汇总

    今天我们一起来看看Linux系统下常用的系统级命令,包括软硬件查看.修改命令,有CPU.内存.硬盘.网络.系统管理等命令. 说明:所有命令是在Centos 6.4 64位的虚拟机系统进行测试的.这些命 ...

  4. Linux之GDB调试命令

    gdb启动 gdb 程序名 l 查看源代码(默认显示十行) l 文件名:行数 l 文件名:函数名 添加断点 break + 行数 (b 也行) b 15 if i == 15 条件断点 i b 查看断 ...

  5. linux下gdb调试方法与技巧整理

    目录 一.gdb简介 二.gdb使用流程 1.启动gdb 2.查看源码 3.运行程序 4.设置断点 5.单步执行 6.查看变量 7.退出gdb 三.gdb基本使用命令 1.运行命令 2.设置断点 3. ...

  6. linux常用调试,linux下gdb常用的调试命令

    用gdb调试程序时,常常很困惑一些命令的使用,要么是不知道这个命令,要么忘了命令的使用方法.接下来是小编为大家收集的linux下gdb常用的调试命令,希望能帮到大家. linux下gdb常用的调试命令 ...

  7. 【Linux】gdb常用的调试命令

    gdb 常用的调试命令 l 显示代码 b +行号 加断点 info break 显示断点信息 delete 删除断点 r 启动程序 n 单步执行,下一步 c 继续执行 s 进入函数 finish 跳出 ...

  8. Linux 运维人最常用 150 个命令汇总

    Linux 运维人最常用 150 个命令汇总 命令 功能说明 线上查询及帮助命令 (2 个) man 查看命令帮助,命令的词典,更复杂的还有 info,但不常用. help 查看 Linux 内置命令 ...

  9. linux之gdb调试常用100个技巧

    linux之gdb调试常用100个技巧 https://gitlore.com/page/gitlore-git/gdb_tips/index.html 如果不懂linux gdb调试的 看下这篇文章 ...

最新文章

  1. python判断素数的函数_Python素数prime函数练习_Python源码实操
  2. 6.2 二叉树的定义、性质与存储结构
  3. (建议收藏)前端面试必问的十六条HTTP网络知识体系
  4. 数据结构---排序算法的总结
  5. linux日志文件优缺点,Linux日志文件总结
  6. NYNU_省赛选拔题(10)
  7. python颜色识别_python实现简单颜色识别程序
  8. 使用xlang开发隐形水印制作工具
  9. 请用python写出奥运五环的绘图程序,20200929 008.海龟绘图_画出奥运五环图
  10. 计算机人工智能应用,计算机在人工智能中的应用研究
  11. Python 用一个脚本来控制另一个脚本的运行、关闭
  12. Bootstrap(10) 进度条媒体对象和 Well 组件
  13. 内存读数据和磁盘读数据的区别
  14. 如何运用Knald烘焙纹理来快速呈现材质纹理细节!
  15. saber与matlab,saber与matlab的比较 (1)
  16. DS18B20读取温度并显示在数码管上
  17. 超级*** 04格式化左脑
  18. HHC6003: Error: The file Itircl.dll has not been
  19. Web死链扫描神器之LinkChecker
  20. hdoj 1869 六度分离

热门文章

  1. window 7 笔记本电源损耗修复(简单方法)
  2. options should NOT have additional properties
  3. HTML5期末大作业:旅游网站设计——蓝色的地方旅游门户(9页) HTML+CSS+JavaScript
  4. 从“地球漫游计划”看城市,如何利用视频监控让城市直播更简单?
  5. RASA3.0-实现FAQ和chitchat功能
  6. java多线程并发卖票问题
  7. linux平台性能监控系统,如何使用top命令监控Linux系统性能
  8. input框中的value值到底是什么
  9. 【日常学习】【二分】【单调队列优化线性DP】codevs3342 绿色通道题解
  10. GPL与BSD许可证的区别