<3> 断点基本管理
<1>单步调试
1. step(或s) : 执行下一行语句,如果有函数调用则进入到函数中。
2. next(或n) : 执行下一行语句,不进行函数。
3. finish :跳出调试的函数
<2> 多文件调试断点标记方法
#include <stdio.h>
void swap(int *a, int
*b);
int main( void )
{
int i = 3;
int j
= 5;
printf("i: %d, j: %d\n", i,
j);
swap(&i,
&j);
printf("i: %d, j: %d\n", i,
j);
return 0;
}
void swap(int *a, int *b)
{
int c =
*a;
*a = *b;
*b = c;
}
那我想。怎么让我调试到swap函数呢?
有几种方法:
1.直接用在gdb中强行指定
//或者以下
2.利用step命令,相当于xcode 里的step into 命令。首先在main 函数执行到swap时打上断点也就是
(注意,有时候b swapper.c:swap, 会不起作用,那么就需要在gcc的时候添加-g,如下:
今天在Linux上用GDB进行程序调试的时候,发现提示:No symbol table is loaded. Use the "file" command.
导致这个错误的原因一般是:在交叉编译时没有加-g选项.
所以在编译程序时一定要注意加上-g这个选项,尤其在写Makefile文件时,
一定不要偷懒,仔细检查,确认每个编译条件都添加了-g选项。
参考:http://blog.csdn.net/whyrun/article/details/7471592)
增
b main.c:4
b main.c:main
删
改
改的话主要用到地方是将普通断点改为条件断点,这在第3章会有具体介绍.
查
<4>断点的逻辑判断
例子:
#include <stdio.h>
int main(void)
{
int i;
for (i = 0; i < 10; ++i)
printf("hello world!");
return 0;
}
需求1.请在i=5的时候停下来.
需求2.请在i=5后,停下来之后.直接跳到return 0;
1 : (gdb)list main //这里例出当前正在调试谁的的具体信息
2: 1 #include <stdio.h>
3: 2
4: 3 int main( void )
5: 4 {
6: 5 int i;
7: 6
8: 7 for( i = 0; i < 10; ++i )
9: 8 printf("hello world!");
10: 9
11: 10 return 0;
12: (gdb) b 8 if i==5 //这里就是所谓的条件断点.当i==5时,在第8行中断
13: Breakpoint 1 at 0x100000eed: file until-anomaly.c, line 8.
14: (gdb) r //运行调试程序
15: Starting program: /Users/cubase01/Desktop/Debugging/Chapter_02/until-anomaly/anomaly
16: Reading symbols for shared libraries +........................ done
17:
18: Breakpoint 1, main () at until-anomaly.c:8
19: 8 printf("hello world!");
20: (gdb) p i //程序已中断,打印i值 i=5
21: $1 = 5
22: (gdb) u 10 //u 是until的缩写,它的意思是 执行到某一行.contine 类似 break 某行->continue的缩写
23: main () at until-anomaly.c:10
24: 10 return 0;
25: (gdb)
参考:
GDB 命令行调试之路(全 1-9) :http://www.cnblogs.com/syncg/archive/2012/12/26/2834503.html