日期:2014-05-16 浏览次数:20496 次
代码源文件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 等*/