64位机 ptrace问题

今天看书看到ptrace这个函数。有人说功能强大,是strace等跟踪工具和gdb调试器的基石。我按网上的资料写个测试程序,发现点问题。

syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_EAX*4, NULL);

这是网上某人写的代码。我把它放到64位linux上编译,发现编译不过,说找不到ORIG_EAX。我明明#include <sys/reg.h>了,怎么回事,我打开reg.h一看,原来里面用了#if WORDSIZE==64  #define ORIG_RAX 15。32位上是ORIG_EAX, 64位上应该用ORIG_RAX。改过来后,编译能过。但运行后,syscallID = -1, 即ptrace返回出错。于是我改成

syscallID = ptrace(PTRACE_PEEKUSER, pid, ORIG_RAX*8, NULL);

再一次运行,ptrace没有返回错误。但是返回的system call ID 不对。比如execv应该返回11, 而上面这句返回59。其它好多返回的system call ID都不对。google了很长时间,没找到相关信息,只是发现一个英文网页http://t977.codeinpro.us/q/508128f74f1eba38a41c015e,这个哥们和我遇到同样问题,但好像没人说清为什么。这可能要看下ptrace的文档和代码,才能搞清楚到底怎么回事。

你可能感兴趣的:(64位机 ptrace问题)