日期:2014-05-16  浏览次数:20453 次

gdb调试函数问题
代码源文件student.c如下:

#include <stdio.h>
#include <string.h>

typedef struct tagStudent
{
	int  id;
	char name[10];
}Student_S;


void operateStudent(Student_S *psStudent, int id, char *name)
{
	psStudent->id = id;
	strcpy(psStudent->name, name);

	printf("id   = %d\nname = %s\n", psStudent->id, psStudent->name);
}

void doSomething()
{
}

int main(int argc, char *argv[])
{
	for (;;)
	{
		doSomething();
	}

	return 0;
}

程序编译:gcc -g -o student student.c

程序运行:./student


    下面主要介绍如何对运行中的系统student的特定函数operateStudent进行调试

具体过程如下:

1. ps aux | grep student  => 查看进程pid

2. gdb attach pid  => 本质调用ptrace

3. 设置断点

     (gdb) b main    /*系统主流程中设置断点主要是为了让系统在断点处停下来,为被调试的函数构造参数*/

     (gdb) b operateStudent

4. (gdb) continue   /*让程序继续向下运行*/

5. 程序在主流程main断点处停下来,此时给需要gdb调试的函数operateStudent构造入参

    (gdb) set  $stu = (Student_S *) malloc(sizeof(Student_S))  /*变量操作同程序中一样 set $stu->id  = 1   set strcpy($stu->name, "me") 等*/

    (gdb) call operateStudent($stu, 1, "who")    /*函数调用同程序中一样*/

    此时,程序会在operateStudent函数断点处停下来

6. (gdb) n   /*执行常规调试过程 n s p /x 等*/