如何快速选中当前页(如何快速选中内容)
681
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
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可以查看当前的可执行文件的函数接口;
(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
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
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小时内删除侵权内容。