Linux至GDB调试教程

1 、安装GDB

[html] view plain copy
 print?
  1. sudo apt-get install gdb  

2 、怎么打断点

1 、源文件的某一行设置断点

[html] view plain copy
 print?
  1. break 行号  

2、一个特定的函数设置断点

[html] view plain copy
 print?
  1. break 函数名  

3、设置条件断点

[html] view plain copy
 print?
  1. break 行号 if 条件  

3、举例分析

hello2.c源文件如下

[html] view plain copy
 print?
  1. #include<stdio.h>  
  2.   
  3. int main() {   
  4.    int a = 1b = 2c = 3;  
  5.    int i;  
  6.    printf("hello chenyu");    
  7.    for (i = 0 ; i < 100; i++) {  
  8.         ++a;  
  9.         if (i > 90) {  
  10.             ++b;  
  11.         } else {  
  12.             ++c;  
  13.         }  
  14.    }   
  15.    printf("a = %d, b = %d, c = %d", a, b, c);  
  16.    int cc = 0;  
  17.    for (cc; cc < 9; cc++) {  
  18.         printf("c %d", i);  
  19.    }  
  20.    return 0;  
  21. }  

比如我们在 ++b (第10行)这行和printf("c %d", i)(第18行)这两行打断点命名如下

1、编译

[html] view plain copy
 print?
  1. gcc -g hello2.c  

2、gdb调试

[html] view plain copy
 print?
  1. gdb hello2  

3、显示代码行数命令如下

[html] view plain copy
 print?
  1. list  
3次回车

4 、然后输入下面打断点命令

[html] view plain copy
 print?
  1. break 10  
  2.   
  3. break 18  

图片如下:

Linux至GDB调试教程

5 、 运行并且跳转到断点

1、运行

[html] view plain copy
 print?
  1. start  

2 、跳转到断点命令(countine 简写c)

[html] view plain copy
 print?
  1. c  

程序就到到++b 这行来,上面2个步骤也可以用这个run (简写 r)命令代码

[html] view plain copy
 print?
  1. r  

Linux至GDB调试教程

我们这里代码会跳到这个断点里面来,我么就避免了手动循环这么多次,因为这个断点会打很多次,所以我们可以用c命令,还是会在这行,所以打断点一般不要打在循环里面,当这个代码执行完之后,我们再用c命令,就会打印18行的代码

Linux至GDB调试教程

我们也可以用watch命令来观察变量,如果变量的值发生变化,程序就会停止

[html] view plain copy
 print?
  1. watch b  

我么看变量的值或则单个变量的值可以用下面命令

[html] view plain copy
 print?
  1. i locals  
  2.   
  3. p c  

Linux至GDB调试教程

进入函数内部用下面命令

[html] view plain copy
 print?
  1. s  

单步调试往下执行用下面命令

[html] view plain copy
 print?
  1. n  

删除断点

[html] view plain copy
 print?
  1. delete 行号  

退出gdb命令

[html] view plain copy
 print?
  1. quit  

4、如何保存断点

有时候运行时,上次打的断点没了,怎么保存呢?

1、查看断点信息并保存

[html] view plain copy
 print?
  1. info b  

Linux至GDB调试教程

2 、保存断点

[html] view plain copy
 print?
  1. save breakpoint fig.dp  

断点保存在fig.dp文件里面

3、调试时候读取保存断点文件

[html] view plain copy
 print?
  1. gdb hello2 -x fig.dp  

要记住加上参数 -x 

然后再去查看是否有断点

[html] view plain copy
 print?
  1. info b  
Linux至GDB调试教程

可以看到是有2个断点的

5、总结

       学会了gdb打断点的基本命令,还有一些调试手段,以及断点的保存。