服务端入门《六》(gdb 调试例子)


<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中强行指定

 
 b swapper.c:swap 

//或者以下

 
 b swapper.c:1 

2.利用step命令,相当于xcode  里的step into 命令。首先在main 函数执行到swap时打上断点也就是

 
 b main.c:10 

(注意,有时候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)

<3> 断点基本管理

 
 b 1
b main.c:4
b main.c:main

 
 delete 1//删除Num为1的断点。哪来的Num?? 输入 i b 在gdb中的断点列表的第一列!delete 1 2 5 //可以同时删除多个断点delete//如果没有参数 则删除所有断点clear//消除gdb当前行的断点.clear main //注意没有delete main这样的命令 clear main的意思是,清除函数main内所有的断点。clear main.c:main //同上clear 2clear main.c:2 

改的话主要用到地方是将普通断点改为条件断点,这在第3章会有具体介绍.

1:  2: cond 3 i >3//将Num为3的断点加上i>3的条件,满足此条件时.停在此断点

1:  2: info break

<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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值