Linux环境下GDB的使用 – wyb

欢迎关注我的个人博客blog.timene.com

程序代码中的错误可分为数类,除了最容易排除的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。GDB的功能便是寻找执行时错误。如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。有了GDB除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。

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

1.进入除错程序并指定可执行文件。

2.指定程序代码所在目录。

3.设定断点后执行程序。

4.程序于断点中断后,可以(1)检视程序执行状态;检视变量值或变更变量值;

(2)逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。

5.离开除错程序。

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

gdbPROGRAM

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

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

(gdb)directoryDIR

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

(gdb)list=>显示目前执行程序代码前后各五行的程序代码;或是显示从上次list之后的程序代码。

(gdb)listfunction=>显示该程序开始处前后五行的程序代码。

(gdb)list-=>上次显示程序代码的前面的十行。

3:断点的设定与清除

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

(gdb)breakfilename.c:30=>;在filename.c的第三十行处停止执行。

(gdb)breakfunction=>;在进入function时中断程序的执行。

(gdb)breakfilename.c:function=>;在程序代码档filename.c中的函数function处设定断点。

(gdb)break=>;在下一个将被执行的命令设定断点。

(gdb)break…ifcond=>;只有当cond成立的时候才中断。cond须以C语言的语法写成。

3.2:显示各个断点的信息。

(gdb)infobreak

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

(gdb)clearfilename.c:30

3.4:清除断点,NUM是在infobreak显示出来的断点编号。

(gdb)deleteNUM

4:全速及逐步执行程序

4.1:从程序开头全速执行程序,直到遇到断点或是程序执行完毕为止。

(gdb)run

4.2:在程序被中断后,全速执行程序到下一个断点或是程序结束为止(continue指令可简写为c)。

(gdb)continue

4.3:执行一行程序.若呼叫函数,则将该包含该函数程序代码视为一行程序(next指令可简写为n)。

(gdb)next

4.4:执行一行程序.若呼叫函数,则进入函数逐行执行(step指令可简写为s)。

(gdb)step

4.5:执行一行程序,若此时程序是在for/while/doloop循环的最后一行,则一直执行到循环结束后的第一行程序后停止(until指令可简写为u)。

(gdb)until

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

(gdb)finish

5:检视及更改变量值

5.1:print叙述,显示该叙述执行的结果(print指令可简写为p)。如

(gdb)printa=>显示a变量的内容.

(gdb)printsizeof(a)=>显示a变量的长度.

5.2:display叙述,在每个断点或是每执行一步时显示该叙述值。如

(gdb)displaya

5.3:更改变量值:

(gdb)print(a=10)=>将变量a的值设定为10.

6:检视程序执行状态

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

(gdb)backtrace

7:读取Core文件信息

读入PROGRAM及PROGRAM.CORE档,可检视CoreDump时程序变量值及程序流程状态。

gdbPROGRAMcore

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

别人失去了信心,他却下决心实现自己的目标。

Linux环境下GDB的使用 – wyb

相关文章:

你感兴趣的文章:

标签云: