NIUHE

日々私たちが过ごしている日常というのは、実は奇迹の连続なのかもしれんな

gdb基本使用方法

一个除错程序执行的流程通常是这样的:

  1. 进入除错程序并指定可执行文件。
  2. 指定程序代码所在目录。
  3. 设定断点后执行程序。
  4. 程序于断点中断后,可以 1. 检视程序执行状态;检视变量值或变更变量值 2. 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。
  5. 离开除错程序。

进入 GDB 及指定可执行档:

进入 GDB 并读入可执行档 (档名为 PROGRAM),准备进行除错。

1
gdb PROGRAM

指定程序代码所在目录及检视程序代码

增加目录DIR到收寻程序代码的目录列表 (如果你的程序代码和可执行档放在同一个目录下,就不须指定程序代码所在目录。):

1
(gdb) directory DIR

检视程序代码,格式计有:

1
2
3
(gdb) list // 显示目前执行程序代码前后各五行的程序代码;或是显示从上次 list 之后的程序代码
(gdb) list function // 显示该程序开始处前后五行的程序代码。
(gdb) list - //上次显示程序代码的前面的十行。

断点的设定与清除

设定断点(指令为 break,可简写为 (b),格式计有:

1
2
3
4
5
(gdb) break filename.c:30 // 在 filename.c 的第三十行处停止执行。
(gdb) break function // 在进入 function 时中断程序的执行。
(gdb) break filename.c:function // 在程序代码档 filename.c 中的函数 function 处设定断点。
(gdb) break // 在下一个将被执行的命令设定断点。
(gdb) break ... if cond // 只有当 cond 成立的时候才中断。cond 须以 C 语言的语法写成。

显示各个断点的信息。

1
(gdb) info break

清除断点(命令为 clear),格式同 break 。例如 :

1
(gdb) clear filename.c:30

清除断点,NUM 是在 info break 显示出来的断点编号

1
(gdb) delete NUM

全速及逐步执行程序

从程序开头全速执行程序,直到遇到断点或是程序执行完毕为止
1
(gdb) run
在程序被中断后,全速执行程序到下一个断点或是程序结束为止 (continue 指令可简写为 c)
1
(gdb) continue
执行一行程序. 若呼叫函数, 则将该包含该函数程序代码视为一行程序 (next 指令可简写为 n)
1
(gdb) next
执行一行程序. 若呼叫函数, 则进入函数逐行执行 (step 指令可简写为 s)
1
(gdb) step
执行一行程序,若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环结束后的第一行程序后停止 (until 指令可简写为 u)
1
(gdb) until

执行现行程序到回到上一层程序为止。

1
(gdb) finish

检视及更改变量值

print 叙述,显示该叙述执行的结果 (print 指令可简写为 p).如
1
2
(gdb) print a // 显示 a 变量的内容.
(gdb) print sizeof(a) // 显示 a 变量的长度.
display 叙述,在每个断点或是每执行一步时显示该叙述值。如
1
(gdb) display a
更改变量值:
1
(gdb) print (a=10) // 将变量 a 的值设定为 10.

检视程序执行状态

查看程序执行到此时,是经过哪些函数呼叫的程序 (backtrace 指令可简写为 bt),也就是查看函数呼叫堆栈。

1
(gdb) backtrace

读取 Core 文件信息

读入 PROGRAMPROGRAM.CORE 档,可检视 Core Dump 时程序变量值及程序流程状态 。
1
gdb PROGRAM core

说明:core 档案是由 PROGRAM 档执行后,遇到 Core Dump 时产生的 Core 檔檔名。如果你还需要该 Core 档,我们建议你将该档案档名更改为 PROGRAM.core。在输入上述命令后,你可以用 GDB 提供的检视变量值以及检视程序执行状态来读取程序 Core Dump 时的状态。

查看汇编代码、寄存器、内存等

查看汇编代码

查看从当前位置往后10行的代码

1
x /10i $pc

查看寄存器的值

1
2
3
info register
info all-registers
info registers <regname ...>

查看内存的值

1
2
x /10x *<addr>
x /10x $esp

Powered by Hexo and Theme by Hacker
© 2019 NIUHE