我想使用ptrace来检查我的程序产生的程序是由什么系统调用的。 我从这个教程开始,正如我在前一个问题的答案中解释的那样。 我修改了代码,使其适用于我正在使用的平台(SLES 11 64位),并将以下testing代码放在一起,以显示产生的进程所产生的每个系统调用:
#include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <sys/reg.h> #include <sys/syscall.h> /* For SYS_write etc */ pid_t child; void run() { long orig_eax; int status; while(1) { int pid = wait(&status); if (pid == -1) { perror("wait"); kill(child,SIGKILL); return; } printf("Got event from %d.n",pid); if(WIFEXITED(status)) break; orig_eax = ptrace(PTRACE_PEEKUSER,pid,8 * ORIG_RAX,NULL); if (orig_eax == -1) { perror("ptrace"); kill(child,SIGKILL); return; } else { printf("Syscall %ld called.n",orig_eax); } ptrace(PTRACE_SYSCALL,NULL,NULL); } } int main(int /*argc*/,char* argv[]) { child = fork(); if(child == 0) { ptrace(PTRACE_TRACEME,NULL); execl(argv[1],argv[1],NULL); } else { printf("Child process id = %d.n",child); run(); } return 0; }
它工作得非常好:它打印由程序所做的系统调用的id(实际上它打印每个两次,一次在入口和一次退出,但现在没有关系)。 然而,除了检查系统调用之外,我的程序还需要做别的事情,所以我决定把检查移动到一个单独的线程中(我比C更适合C ++,所以我用C ++的方式来做,但是我不要以为重要)。 当然,在这个最新的程序中,我只启动线程,然后join它。
#include <sys/ptrace.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> #include <sys/reg.h> #include <sys/syscall.h> /* For SYS_write etc */ #include <boost/thread.hpp> pid_t child; void run() { long orig_eax; int status; while(1) { int pid = wait(&status); if (pid == -1) { perror("wait"); kill(child,child); boost::thread t(run); t.join(); } return 0; }
这次我收到一条错误消息:
Child process id = 24682. Got event from 24682. ptrace: No such process
为什么是这样? 我试图寻找答案,但没有发现这样的事情。 我发现ptrace不会跟踪由subprocess启动的线程,但是这是另一个需要在以后处理的事情。 这甚至有可能从一个不同的战场检查孩subprocess吗?
在Linux中,进程的堆栈大小是否有限制?
Windows有限的用户安装
铛交叉编译为ARM?
在CI中可以将void *赋给char *,但不能用C ++
如何在Linux中configuration和设置谷歌testing框架
另一个奇怪的是,在我真正的应用程序中,我做了基本相同的事情(但是从一个更复杂的上下文:类,互斥等),我得到一个不同的错误。 而不是ptrace返回一个错误, wait甚至不会返回subprocess上的系统调用(并且subprocess甚至不会停止)。 另一方面,当subprocess退出时, wait按预期工作。
在winsock2中发送其他数据types
我怎样才能让我的.NET应用程序自己擦除?
调用UpdateResourcereplace资源会丢弃RT_STRING资源
在Linux中编译内核代码
据我所知, ptrace每个进程只允许一个跟踪器。 这意味着如果您尝试附加,您可以尝试使用PTRACE_ATTACH强制PTRACE_ATTACH ,您将收到一个错误,告诉ptrace无法附加到指定的进程。
因此,你的错误出现是因为你的线程没有附加到子进程,这样,当你试图-ESRCH它,它失败,发送一个-ESRCH代码。
此外,你可以在这里看一下这个帖子 ,它可能会回答你可能还有其他一些问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。