您的位置:首页 > 大数据 > 人工智能

gdbserver 调试ARM 上的程序出现“ waitpid:Function not implemented ”问题的解决

2008-12-15 19:36 344 查看
ARM上用gdb/gdbserver调试程序,提示: waitpid:Function not implemented 最后google 发现应该是ARM 上面没有相应的系统调用。
以下是我调试的时候用的hello.c

#include <stdio.h>

main (int argc, char **argv)

{

int i;

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

{

printf("Hello i=%d/n",i);

}

return 0;

}

gdbserver 调试后结果如下

/usr/bin # gdbserver 192.168.11.6:2345 hello

Process hello created; pid = 751

waitpid: Function not implemented.

Exiting

/usr/bin # Hello i=0

Hello i=1

Hello i=2

然后敲一下ENTER才回到 shell.

这篇文章提到ARM等一些架构上没有实现waitpid的系统调用。
接下来就是如何解决这个问题了,我的解决办法如下

1.首先在内核的头文件里声明 waitpid的系统调用。在 kernel-version/include/asm-arm/unistd.h 里面添加如下一行 :

#define __NR_waitpid (__NR_SYSCALL_BASE+ 7)

在kernel-version/arch/arm/kernel/calls.S 里,将里面的如下的最后一行注释掉,

/* 5 */ CALL(sys_open)

CALL(sys_close)

/* CALL(sys_ni_syscall) */ /* was sys_waitpid */

然后在下面添加如下的一行

CALL(sys_waitpid)

2. 给编译器传递参数使sys_waitpid对应的代码编译到内核中。

在内核的Makefile里面的CFLAGS_KERNEL 添加如下的参数 -D__ARCH_WANT_SYS_WAITPID
,为什么要添加这个参数呢?看一下 sys_waitpid
的实现(位于kernel-version/kernel/exit.c里面)就清楚了,为了方便,我把它的实现列出如下:

#ifdef __ARCH_WANT_SYS_WAITPID

/*

* sys_waitpid() remains for compatibility. waitpid() should be

* implemented by calling sys_wait4() from libc.a.

*/

asmlinkage long sys_waitpid(pid_t pid, int __user *stat_addr, int options)

{

return sys_wait4(pid, stat_addr, options, NULL);

}

#endif

接下来,就是重新编译内核了。再次调用gdbserver, 192.168.11.6是我的开发机host,192.168.11.7是我的目标机的地址。

/usr/bin # gdbserver 192.168.11.6:2345 hello

Process hello created; pid = 745

在主机端调用gdb hello

然后输入 target remote 192.168.11.6:2345

这时查看目标机的控制台,可以看到打印出“Remote debugging from host 192.168.11.6”

终于成功了!
另外在网上看到过好多关于在ARM上用gdb/gdbserver调试的文章,但都没有提到对内核进行修改,不知道是如何做到的。如果有人遇到和我同样的问题,不妨按照我的方法试试看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐