一个除错程序执行的流程通常是这样的:
- 进入除错程序并指定可执行文件。
- 指定程序代码所在目录。
- 设定断点后执行程序。
- 程序于断点中断后,可以 1. 检视程序执行状态;检视变量值或变更变量值 2. 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。
- 离开除错程序。
进入 GDB 及指定可执行档:
进入 GDB 并读入可执行档 (档名为 PROGRAM
),准备进行除错。
指定程序代码所在目录及检视程序代码
增加目录DIR
到收寻程序代码的目录列表 (如果你的程序代码和可执行档放在同一个目录下,就不须指定程序代码所在目录。):
检视程序代码,格式计有:
1 2 3
| (gdb) list // 显示目前执行程序代码前后各五行的程序代码;或是显示从上次 list 之后的程序代码 (gdb) list function // 显示该程序开始处前后五行的程序代码。 (gdb) list - //上次显示程序代码的前面的十行。
|
断点的设定与清除
设定断点(指令为 break
,可简写为 (b
),格式计有:
1 2 3 4 5
| (gdb) break filename.c:30 (gdb) break function (gdb) break filename.c:function (gdb) break (gdb) break ... if cond
|
显示各个断点的信息。
清除断点(命令为 clear
),格式同 break
。例如 :
1
| (gdb) clear filename.c:30
|
清除断点,NUM
是在 info break
显示出来的断点编号
全速及逐步执行程序
从程序开头全速执行程序,直到遇到断点或是程序执行完毕为止
在程序被中断后,全速执行程序到下一个断点或是程序结束为止 (continue
指令可简写为 c
)
执行一行程序. 若呼叫函数, 则将该包含该函数程序代码视为一行程序 (next
指令可简写为 n
)
执行一行程序. 若呼叫函数, 则进入函数逐行执行 (step
指令可简写为 s
)
执行一行程序,若此时程序是在 for/while/do loop
循环的最后一行,则一直执行到循环结束后的第一行程序后停止 (until
指令可简写为 u
)
执行现行程序到回到上一层程序为止。
检视及更改变量值
print
叙述,显示该叙述执行的结果 (print
指令可简写为 p
).如
1 2
| (gdb) print a (gdb) print sizeof(a)
|
display
叙述,在每个断点或是每执行一步时显示该叙述值。如
更改变量值:
检视程序执行状态
查看程序执行到此时,是经过哪些函数呼叫的程序 (backtrace
指令可简写为 bt
),也就是查看函数呼叫堆栈。
读取 Core 文件信息
读入 PROGRAM
及 PROGRAM.CORE
档,可检视 Core Dump 时程序变量值及程序流程状态 。
说明:core
档案是由 PROGRAM
档执行后,遇到 Core Dump 时产生的 Core 檔檔名。如果你还需要该 Core 档,我们建议你将该档案档名更改为 PROGRAM.core
。在输入上述命令后,你可以用 GDB 提供的检视变量值以及检视程序执行状态来读取程序 Core Dump 时的状态。
查看汇编代码、寄存器、内存等
查看汇编代码
查看从当前位置往后10行的代码
查看寄存器的值
1 2 3
| info register info all-registers info registers <regname ...>
|
查看内存的值
1 2
| x /10x *<addr> x /10x $esp
|