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调试的文章,但都没有提到对内核进行修改,不知道是如何做到的。如果有人遇到和我同样的问题,不妨按照我的方法试试看。
以下是我调试的时候用的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调试的文章,但都没有提到对内核进行修改,不知道是如何做到的。如果有人遇到和我同样的问题,不妨按照我的方法试试看。
相关文章推荐
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—3—段错误
- Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试 上
- Eclipse-cdt 配合 gdbserver 进行 arm 程序远程调试
- GDB+GdbServer: ARM程序调试
- qtcretor通过gdb和gdbserver远程调试arm程序
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—1—手机死机
- 写了一个查询数据库的程序,不熟的Tomcat6。查询条件为英文时运行正常,为中文时出现乱码。后在tomcap的server.xml中加入useBodyEncodingForURI="true解决了问题
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—2—段错误
- gdb的简单使用和gdb+gdbserver方式进行ARM程序调试
- VS2010调试“正试图在 OS 加载程序锁内执行托管代码”和运行出现R6034问题解决
- db的简单使用和gdb+gdbserver方式进行ARM程序调试
- 如何解决Linux下Qt Creator调试C/C++程序出现Debugging starts &"warning: GDB: Failed to set controlling terminal警告
- gdb+gdbserver的方式进行ARM程序调试
- S3C2440 windows下使用jlink gdbserver,arm-none-eabi-gdb进行裸机程序编写调试
- gdb+gdbserver方式进行ARM程序调试
- (OK) 调试cBPM—CentOS7—gdb—gdbserver—问题的解决—完整的调试过程—成功
- gdb+gdbserver的方式进行ARM程序调试
- gdb的简单使用和gdb+gdbserver方式进行ARM程序调试
- gdb+gdbserver方式进行ARM程序调试
- 【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】gdb+gdbserver的方式进行ARM程序调试