Linux环境下GDB的使用

来源:互联网 发布:java自学需要多久 编辑:程序博客网 时间:2024/05/17 01:55

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


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


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

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

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

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

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

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

5. 离开除错程序。  


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

gdb PROGRAM 


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

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

(gdb) directory DIR  

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

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

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

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


3:断点的设定与清除 

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

(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 语言的语法写成。  

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

(gdb) info break  

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

(gdb) clear filename.c:30  

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

(gdb) delete NUM 


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/do loop 循环的最后一行,则一直执行到循环结束后的第一行程序后停止 (until 指令可简写为u)。  

(gdb) until  

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

(gdb) finish 


5:检视及更改变量值 

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

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

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

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

  (gdb) display a  

5.3:更改变量值:  

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


6:检视程序执行状态 

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

(gdb) backtrace 


7:读取 Core 文件信息 

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

gdb  PROGRAM  core  

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