linux gdb快速入门教程

网友投稿 717 2022-05-30

文章目录

前言

常用指令概览

开始使用gdb

一个完整流程一般所需步骤

1 加载程序

2 查看

2.1 查看函数

3 设置断点

3.1 根据函数名设置断点

3.2 根据程序位置(第几行)

4 运行程序

5 查看变量

6 查看寄存器

总结

参考

前言

gdb是一个由GNU开源组织发布的、UNIX/LINUX操作系统下的、基于命令行的、功能强大的程序调试工具。对于想要学习gdb调试的童鞋,网上搜一下就是一大堆资料,信息太多而不知道该如何筛选了,当然最有效的方式是去看gdb的手册,但是对于想快速上手的我,需要掌握最常用的一些指令和一些技巧,期间,我找到了一本很强大的书,感觉就是gdb bible——100-gdb-tips,100-gdb-tips-gitbook;强烈推荐参考这个文档。文档里已经基本涵盖了gdb使用的各种操作和技巧,但是都相互比较独立和分散,没有一个完整的使用流程,下面我会总结一下整体使用的一个流程。

常用指令概览

开始使用gdb

通常我们编写一个程序,具体程序如下所示;并且编译成带调试信息的可执行文件,然后在用gdb加载调试;

/* * demo learning gdb * gdb-sample.c */ #include void func_a(int *p){ printf("%s:p is %d | valuse is %d \n",__func__,p,*p); } void func_b(int *p){ *p = 12345; func_a(p); } void func_c(int *p){ p = NULL; func_b(p); } int main(void) { int i = 0,j=0; int *p = &j; for(; i<6; i++){ if(i<2){ func_a(p); }else if(i<4){ func_b(p); }else{ func_c(p); } } return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

gcc -g gdb-sample.c -o gdb-sample

1

记得带上-g选项,最后编译成功并生成可执行文件gdb-sample;

一个完整流程一般所需步骤

gdb -q gdb-sample

1

使用i functions或者info functions可以查看当前的可执行文件的函数接口;

linux gdb快速入门教程

(gdb) i functions All defined functions: File gdb-sample.c: void func_a(int *); void func_b(int *); void func_c(int *); int main(void); Non-debugging symbols: 0x0000000000400460 _init 0x0000000000400490 puts@plt 0x00000000004004a0 __stack_chk_fail@plt 0x00000000004004b0 printf@plt 0x00000000004004c0 __libc_start_main@plt 0x00000000004004e0 _start 0x0000000000400510 deregister_tm_clones 0x0000000000400550 register_tm_clones 0x0000000000400590 __do_global_dtors_aux 0x00000000004005b0 frame_dummy 0x00000000004006f0 __libc_csu_init 0x0000000000400760 __libc_csu_fini 0x0000000000400764 _fini

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

断点使用

(gdb) b main Breakpoint 1 at 0x400658: file gdb-sample.c, line 19.

1

2

(gdb) l 1 #include 2 3 void func_a(int *p){ 4 printf("%s:p is %d | valuse is %d \n",__func__,p,*p); 5 } 6 7 void func_b(int *p){ 8 *p = 12345; 9 func_a(p); 10 } (gdb) 11 12 void func_c(int *p){ 13 p = NULL; 14 func_b(p); 15 } 16 17 18 19 int main(void) { 20 int i = 0,j=0; (gdb) 21 int *p = &j; 22 for(; i<6; i++){ 23 if(i<2){ 24 func_a(p); 25 }else if(i<4){ 26 func_b(p); 27 }else{ 28 func_c(p); 29 } 30 } (gdb) b 19 Breakpoint 3 at 0x400618: file gdb-sample.c, line 19.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

删除断点

(gdb) d 删除所有断点吗? (y or n) y

1

2

使用run或r运行程序,如果被断点中断,可以使用c继续运行程序;

(gdb) r Starting program: /home/thinkpad/code/gdb-tips/core_dump/gdb-sample Breakpoint 1, main () at gdb-sample.c:19 19 int main(void) {

1

2

3

4

5

使用next或者n可以进行单步调试;不会进入到子函数内部;

使用step或者s可以进行单步调试;会进入到子函数内部;

查看变量可以使用print和p

(gdb) b main Breakpoint 6 at 0x400618: file gdb-sample.c, line 19. (gdb) r The program being debugged has been started already. Start it from the beginning? (y or n) y Starting program: /home/zhaojh/code/gdb-tips/core_dump/gdb-sample Breakpoint 6, main () at gdb-sample.c:19 19 int main(void) { (gdb) n 20 int i = 0,j=0; (gdb) p i $1 = 0 (gdb) n 21 int *p = &j; (gdb) n 22 for(; i<6; i++){ (gdb) p p $2 = (int *) 0x7fffffffe2f8 (gdb) p *p $3 = 0 (gdb)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

使用i r,info register,i register,info r可以查看寄存器;

(gdb) i r rax 0x7fffffffe2f8 140737488347896 rbx 0x0 0 rcx 0x0 0 rdx 0x7fffffffe408 140737488348168 rsi 0x7fffffffe3f8 140737488348152 rdi 0x1 1 rbp 0x7fffffffe310 0x7fffffffe310 rsp 0x7fffffffe2f0 0x7fffffffe2f0 r8 0x400710 4196112 r9 0x7ffff7de7ac0 140737351940800 r10 0x846 2118 r11 0x7ffff7a2d740 140737348032320 r12 0x4004a0 4195488 r13 0x7fffffffe3f0 140737488348144 r14 0x0 0 r15 0x0 0 rip 0x40063f 0x40063f eflags 0x293 [ CF AF SF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

总结

记录了一些比较简单并且会被普遍用到的gdb指令,作为入门使用还是比较好的,更多高级的调试参考gdb bible——100-gdb-tips,100-gdb-tips-gitbook。

参考

https://github.com/hellogcc/100-gdb-tips

https://wizardforcel.gitbooks.io/100-gdb-tips/content/

GDB十分钟教程

Linux 单片机 汇编语言

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:[CloudNative] 企业应用上云实践手记-Cloud Native Phase 2 - 云上DevOps
下一篇:2020年人工神经网络第二次作业
相关文章