gdb入门系列3
mufiye 内核新手

GDB入门系列3

查看栈信息

概要

  • backtrace(缩写为bt)
    打印当前的函数调用栈的所有信息。
  • backtrace
    n是一个正整数,表示只打印栈顶上n层的栈信息。
  • backtrace <-n>
    -n表一个负整数,表示只打印栈底下n层的栈信息。
  • frame
    n是一个从0开始的整数,是栈中的层编号。比如:frame 0,表示栈顶,frame 1,表示栈的第二层。
  • up
    表示向栈的上面移动n层,可以不打n,表示向上移动一层。
  • down
    表示向栈的下面移动n层,可以不打n,表示向下移动一层。
  • 上面的命令,都会打印出移动到的栈层的信息。如果你不想让其打出信息。你可以使用这三个命令:select-frame 对应于 frame 命令,up-silently 对应于 up 命令,down-silently 对应于 down 命令。
  • frame 或 f
    会打印出这些信息:栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句。
  • info frame
    这个命令会打印出更为详细的当前栈层的信息,只不过,大多数都是运行时的内内地址。比如:函数地址,调用函数的地址,被调用函数的地址,目前的函数是由什么样的程序语言写成的、函数参数地址及值、局部变量的地址等等。
  • info args
    打印出当前函数的参数名及其值。
  • info locals
    打印出当前函数中所有局部变量及其值。
  • info catch
    打印出当前的函数中的异常处理信息。

实验

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
(gdb) backtrace
No stack.
(gdb) r
Starting program: /home/ubuntu/learn_gdb/tst
result[1-100] = 5050
result[1-250] = 31125
[Inferior 1 (process 3011899) exited normally]
(gdb) backtrace
No stack.
(gdb) break func
Breakpoint 1 at 0x555555555149: file tst.c, line 4.
(gdb) r
Starting program: /home/ubuntu/learn_gdb/tst

Breakpoint 1, func (n=0) at tst.c:4
4 {
(gdb) bt
#0 func (n=0) at tst.c:4
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
(gdb) bt 1
#0 func (n=0) at tst.c:4
(More stack frames follow...)
(gdb) bt -1
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
(gdb) bt 2
#0 func (n=0) at tst.c:4
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
(gdb) bt -2
#0 func (n=0) at tst.c:4
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
(gdb) frame 1
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
31 sum = func(10);
(gdb) up 1
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
31 sum = func(10);
(gdb) down 1
#0 func (n=0) at tst.c:4
4 {
(gdb) frame
#0 func (n=0) at tst.c:4
4 {
(gdb) up 1
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
31 sum = func(10);
(gdb) frame
#1 0x0000555555555221 in main (argc=1, argv=0x7fffffffe148) at tst.c:31
31 sum = func(10);
(gdb) info frame
Stack level 1, frame at 0x7fffffffe060:
rip = 0x555555555221 in main (tst.c:31); saved rip = 0x7ffff7df30b3
caller of frame at 0x7fffffffe020
source language c.
Arglist at 0x7fffffffe018, args: argc=1, argv=0x7fffffffe148
Locals at 0x7fffffffe018, Previous frame's sp is 0x7fffffffe060
Saved registers:
rbp at 0x7fffffffe050, rip at 0x7fffffffe058
(gdb) down 1
#0 func (n=0) at tst.c:4
4 {
(gdb) info frame
Stack level 0, frame at 0x7fffffffe020:
rip = 0x555555555149 in func (tst.c:4); saved rip = 0x555555555221
called by frame at 0x7fffffffe060
source language c.
Arglist at 0x7fffffffe010, args: n=0
Locals at 0x7fffffffe010, Previous frame's sp is 0x7fffffffe020
Saved registers:
rip at 0x7fffffffe018
(gdb) info locals
sum = -8137
i = 32767
(gdb) info args
n = 0
(gdb) info catch
Undefined info command: "catch". Try "help info".

查看源程序

显示源代码

  • list
    显示程序第linenum行的周围的源程序。
  • list
    显示函数名为function的函数的源程序。
  • list
    显示当前行后面的源程序。
  • list -
    显示当前行前面的源程序。
  • set listsize
    设置一次显示源代码的行数。
  • show listsize
    查看当前listsize的设置。
  • list ,
    显示从first行到last行之间的源代码。
  • list ,
    显示从当前行到last行之间的源代码。
  • list +
    往后显示源代码。

搜索源代码

  • forward-search/search
    从当前行向后查找匹配某个字符串的程序行
  • reverse-search
    从当前行向后查找匹配某个字符串的程序行

指定源文件的路径

某些时候,用-g编译过后的执行程序中只是包括了源文件的名字,没有路径名。GDB提供了可以让你指定源文件的路径的命令,以便GDB进行搜索。

  • directory <dirname … >,dir <dirname … >
    加一个源文件路径到当前路径的前面。如果你要指定多个路径,UNIX下你可以使用“:”,Windows下你可以使用“;”。
  • directory
    清除所有的自定义的源文件搜索路径信息。
  • show directories
    显示定义了的源文件搜索路径。

源代码的内存

  • info line可以查看源代码在内存中的地址
  • disassemble指令可以查看源程序的当前执行时的机器码
    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
    36
    37
    38
    39
    40
    41
    (gdb) break func
    Breakpoint 1 at 0x1149: file tst.c, line 4.
    (gdb) info line tst.c:func
    Line 4 of "tst.c" starts at address 0x1149 <func> and ends at 0x1154 <func+11>.
    (gdb) r
    Starting program: /home/ubuntu/learn_gdb/tst

    Breakpoint 1, func (n=0) at tst.c:4
    4 {
    (gdb) c
    Continuing.
    result[1-100] = 5050

    Breakpoint 1, func (n=10) at tst.c:4
    4 {
    (gdb) c
    Continuing.
    result[1-250] = 31125
    [Inferior 1 (process 3016500) exited normally]
    (gdb) info line tst.c:func
    Line 4 of "tst.c" starts at address 0x555555555149 <func> and ends at 0x555555555154 <func+11>.
    (gdb) disassemble func
    Dump of assembler code for function func:
    0x0000555555555149 <+0>: endbr64
    0x000055555555514d <+4>: push %rbp
    0x000055555555514e <+5>: mov %rsp,%rbp
    0x0000555555555151 <+8>: mov %edi,-0x14(%rbp)
    0x0000555555555154 <+11>: movl $0x0,-0x8(%rbp)
    0x000055555555515b <+18>: movl $0x0,-0x4(%rbp)
    0x0000555555555162 <+25>: jmp 0x55555555516e <func+37>
    0x0000555555555164 <+27>: mov -0x4(%rbp),%eax
    0x0000555555555167 <+30>: add %eax,-0x8(%rbp)
    0x000055555555516a <+33>: addl $0x1,-0x4(%rbp)
    0x000055555555516e <+37>: mov -0x4(%rbp),%eax
    --Type <RET> for more, q to quit, c to continue without paging--c
    0x0000555555555171 <+40>: cmp -0x14(%rbp),%eax
    0x0000555555555174 <+43>: jl 0x555555555164 <func+27>
    0x0000555555555176 <+45>: mov -0x8(%rbp),%eax
    0x0000555555555179 <+48>: pop %rbp
    0x000055555555517a <+49>: retq
    End of assembler dump.
  • 本文标题:gdb入门系列3
  • 本文作者:mufiye
  • 创建时间:2021-11-24 14:58:48
  • 本文链接:http://mufiye.github.io/2021/11/24/gdb入门系列3/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论