snifer

【原创】嵌入式GDB调试工具的原理及教程

0
阅读(2050)

在嵌入式系统中经常会用到GDB调试工具,今天我就通过一个实例说明这个工具的原理及应用。

【实验平台】

带有Linux操作系统的PC机。

1、使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序输出main函数中定义的字符串,但结果显示没有输出。

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

int display1(char *string);

int display2(char *string);

 

int main (int argc,char **argv)

{

         char string[] = "Embedded Linux";

         display1 (string);

         display2 (string);

}

int display1 (char *string)

{

         printf ("The original string is %s \n", string);

}

int display2 (char *string1)

{

         char *string2;

         int size,i;

         size = strlen (string1);

         string2 = (char *) malloc (size+1);

         for (i = 0; i < size; i++)

                   string2[size - i] = string1[i];

         string2[size+1] = ' ';

         printf("The string afterward is %s\n",string2);

free(string2);

}

2、使用gcc编译这段代码,gcc –g greet.c –o greet,注意要加上‘-g’选项以方便之后的调试。

3、运行生成的可执行文件./greet,观察运行结果。

4、使用gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。

5、纠正错误,更改源程序并得到正确的结果。

The original string is Embedded Linux

The string afterward is

6、启动gdb调试:gdb greet

7、查看源代码,使用命令‘l’。

8、在30行(for循环处)设置断点,使用命令‘b30

9、在33行(printf函数处)设置断点,使用命令‘b33

10、查看断点设置情况,使用命令‘info b

11、运行代码,使用命令‘r

12、单步运行代码,使用命令‘n

13、查看暂停点变量值,使用命令‘p string2[size - i]

14、继续单步运行代码数次,并使用命令查看,发现string2[size-1]的值正确。

15、继续程序的运行,使用命令‘c

16、程序在printf前停止运行,此时依次查看string2[0]string2[1]…,发现string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31行,发现程序运行结果错误的原因在于‘size-i’。由于i只能增到‘size-i’,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。

17、退出gdb,使用命令q

18、重新编辑greet.c,把其中的“string2[size - i] = string1[i]”改为“string2[size – i - 1] = string1[i];”即可

19、使用gcc重新编译:gcc –g greet.c –o greet

20、查看运行结果:./greet,得到结果正确

The original string is Embedded Linux

The string afterward is xuniL deddedbmE

这个工具熟练使用以后对大家以后调试程序有非常好的启发作用,今天就写这么多。