【原创】嵌入式GDB调试工具的原理及教程
0赞在嵌入式系统中经常会用到GDB调试工具,今天我就通过一个实例说明这个工具的原理及应用。
【实验平台】
带有Linux操作系统的PC机。
1、使用vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的原意为输出倒序输出main函数中定义的字符串,但结果显示没有输出。
#include
#include
#include
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
这个工具熟练使用以后对大家以后调试程序有非常好的启发作用,今天就写这么多。