GDB调试学习

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

简介

​GDB 全称“GNU symbolic debugger”它诞生于 GNU 计划同时诞生的还有 GCC、Emacs 等是 Linux 下常用的程序调试器。发展至今GDB 已经迭代了诸多个版本当下的 GDB 支持调试多种编程语言编写的程序包括 C、C++、Go、Objective-C、OpenCL、Ada 等。

在这里插入图片描述

准备工作

用以下命令编译

gcc -g -Wall program.c -o program
  • -Wall开启所有警告可以理解为warinig all使用它能够使GCC产生尽可能多的警告信息。
  • -g选项的作用是在可执行文件中加入源代码的信息比如可执行文件中第几条机器指令对应源代码的第几行但并不是把整个源文件嵌入到可执行文件中所以在调试时必须保证 gdb 能找到源文件。

常用命令

启动与退出

  • 启动gdb 可执行程序
  • 退出quit/q
(base) user@ubuntu:~/Desktop/OS/NiuKe$ vim test.c
(base) user@ubuntu:~/Desktop/OS/NiuKe$ gcc test.c -o test -g -std=c99
(base) user@ubuntu:~/Desktop/OS/NiuKe$ ls
test  test.c
(base) user@ubuntu:~/Desktop/OS/NiuKe$ gdb test
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) q

给程序设置参数/获取设置参数

  • 设置参数set args 10 20
  • 获取设置参数show args
(base) user@ubuntu:~/Desktop/OS/NiuKe$ gdb test
GNU gdb (Ubuntu 8.1.1-0ubuntu1) 8.1.1
Copyright (C) 2018 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...done.
(gdb) set args 10 20
(gdb) show args
Argument list to give program being debugged when it is started is "10 20"

GDB使用帮助

  • help
(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

Type "help" followed by a class name for a list of commands in that class.
Type "help all" for the list of all commands.
Type "help" followed by command name for full documentation.
Type "apropos word" to search for commands related to "word".
Command name abbreviations are allowed if unambiguous.

查看当前文件代码

  • 从默认位置显示list/l
(gdb) l
1	#include <stdio.h>
2	#include <stdlib.h>
3	
4	int test(int a);
5	
6	int main(int argc, char* argv[]) {
7	    int a, b;
8	    printf("argc = %d\n", argc);
9	
10	    if(argc < 3) {
(gdb) list
11	        a = 10;
12	        b = 30;
13	    } else {
14	        a = atoi(argv[1]);
15	        b = atoi(argv[2]);
16	    }
17	    printf("a = %d, b = %d\n", a, b);
18	    printf("a + b = %d\n", a + b);
19	
20	    for(int i = 0; i < a; ++i) {
(gdb) l
21	        printf("i = %d\n", i);
22	        // 函数调用
23	        int res = test(i);
24	        printf("res value: %d\n", res);
25	    }
26	
27	    printf("THE END !!!\n");
28	    return 0;
29	}
  • 从指定的行显示list/l 行号
(gdb) l 13
8	    printf("argc = %d\n", argc);
9	
10	    if(argc < 3) {
11	        a = 10;
12	        b = 30;
13	    } else {
14	        a = atoi(argv[1]);
15	        b = atoi(argv[2]);
16	    }
17	    printf("a = %d, b = %d\n", a, b);
  • 从指定的函数显示list/l 函数名
(gdb) l main
1	#include <stdio.h>
2	#include <stdlib.h>
3	
4	int test(int a);
5	
6	int main(int argc, char* argv[]) {
7	    int a, b;
8	    printf("argc = %d\n", argc);
9	
10	    if(argc < 3) {

查看非当前文件代码

  • 编译运行并使用gdb main。
  • 从指定文件指定的行显示list/l 文件名:行号。
  • 从指定文件指定的函数显示list/l 文件名:函数名。

这部分实践操作和上面的一样只不过这部分是将多个文件编译成可执行文件

查看及设置显示的行数

  • 查看显示的行数show list/listsize
  • 设置显示的行数set list/listsize
(gdb) show list
Number of source lines gdb will list by default is 10.
(gdb) set listsize 20
(gdb) show listsize 
Number of source lines gdb will list by default is 20.

断点操作

设置断点

  • 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

前置文件需求

(base) user@ubuntu:~/Desktop/OS/NiuKe$ ls
bubble.cpp  main.cpp  select.cpp  sort.h  test  test.c
(base) user@ubuntu:~/Desktop/OS/NiuKe$ g++ bubble.cpp select.cpp main.cpp -o main -g
(base) user@ubuntu:~/Desktop/OS/NiuKe$ ls
bubble.cpp  main  main.cpp  select.cpp  sort.h  test  test.c

调试操作(※)

  • 运行 GDB 程序
    • 程序停在第一行start
    • 遇到断点才停run
  • 继续运行到下一个断点停c/continue
  • 向下执行一行代码不会进入函数体n/next
  • 变量操作
    • 打印变量值p/print 变量名
    • 打印变量类型ptype 变量名
  • 向下单步调试遇到函数进入函数体
    • s/step
    • 跳出函数体finish
  • 自动变量操作
    • 自动打印指定变量的值display 变量名
    • 查看自动变量i/info display
    • 取消自动变量undisplay 编号
  • 其它操作
    • 设置变量值set var 变量名=变量值 循环中用的较多
    • 跳出循环until

ex1

(gdb) i b  #还未开始打断电
No breakpoints or watchpoints.
(gdb) start  #停在第一行程序
Temporary breakpoint 1 at 0x400a49: file main.cpp, line 8.
Starting program: /home/user/Desktop/OS/NiuKe/main 

Temporary breakpoint 1, main () at main.cpp:8
8	    int array[] = {12, 27, 55, 22, 67};
(gdb) c    # 继续运行到下一个断点停。即运行完全部程序
Continuing.
冒泡排序之后的数组: 12 22 27 55 67 
===================================
选择排序之后的数组: 11 25 36 47 80 
[Inferior 1 (process 3989) exited normally]

参考资料

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6