Linux GDB调试

1、什么是GDB

2、准备工作

3、GDB启动、退出、查看代码


输入:

cpp 复制代码
gcc test.c -o test -g
gcc test.c -o test1
ll -h test test1

输出:

cpp 复制代码
-rwxr-xr-x 1 petri petri 20K Apr 21 18:50 test*
-rwxr-xr-x 1 petri petri 17K Apr 21 18:50 test1*

可以看出加入-g文件变大了。

进入gdb调试:

cpp 复制代码
gdb test
cpp 复制代码
(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) q (退出)

关于list:

-g 选项的作用是在可执行文件中加入源代码信息,比如可执行文件中第几条机器指令对应源代码的第几行,并没有把源代码嵌入可执行文件中。所以源代码文件不可以没有。

1、显示

list 一次显示10行:

cpp 复制代码
(gdb) list
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) {
cpp 复制代码
(gdb) list 10 (第十行开始显示)

(gdb) list main (main函数开始显示)

(gdb) list bubble.cpp:10  (通过文件名:行号)

(gdb) list select.cpp:selectSort (通过文件名:函数) 

2、设置显示行数

cpp 复制代码
(gdb) show list
Number of source lines gdb will list by default is 10.
(gdb) set list 20
(gdb) show list
Number of source lines gdb will list by default is 20.

4、GDB打断点

cpp 复制代码
(gdb) break 10
Breakpoint 1 at 0x11b2: file test.c, line 10

(gdb) d 1

(gdb) i b
No breakpoints or watchpoints.

(gdb) break 11
Breakpoint 2 at 0x11b2: file test.c, line 11.

(gdb) disable 2

(gdb) enable 2

(gdb) info break
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x00000000000011b2 in main at test.c:11

(gdb) break 21 if i=3
Breakpoint 3 at 0x1231: file test.c, line 21.

(gdb) info break
Num     Type           Disp Enb Address            What
2       breakpoint     keep y   0x00000000000011b2 in main at test.c:11
3       breakpoint     keep y   0x0000000000001231 in main at test.c:21
        stop only if i=3

5、GDB调试命令

cpp 复制代码
(gdb) start
Temporary breakpoint 4 at 0x1189: file test.c, line 6.
Starting program: /home/petri/lesson01/03_gdb/test 

Temporary breakpoint 4, main (argc=0, argv=0x0) at test.c:6
6       int main(int argc, char* argv[]) {

(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /home/petri/lesson01/03_gdb/test 
argc = 1

Breakpoint 2, main (argc=1, argv=0x7ffffffedc78) at test.c:10
10          if(argc < 3) {

(gdb) continue
Continuing.
a = 10, b = 30
a + b = 40

Breakpoint 3, main (argc=1, argv=0x7ffffffedc78) at test.c:21
21              printf("i = %d\n", i);

test.c的代码:

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int test(int a);

int main(int argc, char* argv[]) {
    int a, b;
    printf("argc = %d\n", argc);

    if(argc < 3) {
        a = 10;
        b = 30;
    } else {
        a = atoi(argv[1]);
        b = atoi(argv[2]);
    }
    printf("a = %d, b = %d\n", a, b);
    printf("a + b = %d\n", a + b);

    for(int i = 0; i < a; ++i) {
        printf("i = %d\n", i);
        // 函数调用
        int res = test(i);
        printf("res value: %d\n", res);
    }

    printf("THE END !!!\n");
    return 0;
}

int test(int a) {
    int num = 0;
    for(int i = 0; i < a; ++i) {
        num += i;
    }
    return num;
}
相关推荐
王老师青少年编程21 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
平行云21 分钟前
虚拟直播混合式2D/3D应用程序实时云渲染推流解决方案
linux·unity·云原生·ue5·图形渲染·实时云渲染·像素流送
晓觉儿31 分钟前
【GPLT】2026年第十一届团队程序设计天梯赛赛后题解(已写2h,存档中)
数据结构·c++·算法·深度优先·图论
我想成为你噶叻叻猪1 小时前
imx6ull板子ping不通ubuntu
linux·运维·ubuntu
桌面运维家1 小时前
校园机房vDisk IDV云桌面Linux更新部署方案
linux·运维·服务器
2601_949194261 小时前
Redis的安装教程(Windows+Linux)【超详细】
linux·数据库·redis
6Hzlia1 小时前
【Hot 100 刷题计划】 LeetCode 394. 字符串解码 | C++ 单栈回压法
c++·算法·leetcode
傻啦嘿哟1 小时前
Python 文件批量处理:重命名/备份/同步运维实战指南
linux·数据库·github
cyber_两只龙宝1 小时前
【Oracle】 Oracle之SQL的子查询
linux·运维·数据库·sql·云原生·oracle
司南-70491 小时前
opencode环境搭 并 配置自定义BASE URL
linux·运维·服务器·人工智能