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

来源:互联网 发布:哪个搜索软件好 编辑:程序博客网 时间:2024/04/20 13:17


<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



0 0
原创粉丝点击