首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >附加到进程后,如何检查tracee是否在syscall中?

附加到进程后,如何检查tracee是否在syscall中?
EN

Stack Overflow用户
提问于 2018-08-28 11:06:33
回答 2查看 1.5K关注 0票数 9

根据ptrace手册页

系统呼叫-进入-停止和syscall-出口-停止是无法区分的跟踪器彼此。跟踪器需要跟踪ptrace的顺序,这样才不会将syscall-输入-停止误解为syscall-退出-停止,反之亦然。

当我使用PTRACE_ATTACH附加到进程时,如何知道tracee当前是否在syscall中?换句话说,如果我使用PTRACE_SYSCALL重新启动tracee,如何知道下一个syscall-stop是syscall-enter-stop还是syscall-exit-stop

EN

回答 2

Stack Overflow用户

发布于 2019-04-16 13:53:36

当跟踪的进程在系统调用条目上停止时,EAX寄存器将包含-ENOSYS,而orig_rax具有该系统调用的编号。

下面的代码示例演示了一个示例。

代码语言:javascript
复制
if (registers.rax == -ENOSYS)
                { switch (registers.orig_rax)
                        {
                          case _NR_open: //Example
                          break;
                          default:
                    // to get the arguments

                        fprintf(stderr, "%#08x, %#08x, %#08x",
                                registers.rbx, registers.rcx, 
                                                registers.rdx);
                     break;
                     }
              }
              else
              {
                if (registers.rax < 0)
                {
                        // error condition
                        fprintf(stderr, "#Err: %s\n", 
                 errors[abs(registers.rax)]);
                }
                else
                {
                        // return code
                        fprintf(stderr, "%#08x\n", registers.rax);
                }
        }
票数 2
EN

Stack Overflow用户

发布于 2018-08-28 17:12:09

当我使用PTRACE_ATTACH附加到进程时,如何知道tracee当前是否在syscall中?

当您使用PTRACE_ATTACH附加到进程时,tracee将被发送一个停止信号。

停止信号可以在执行用户空间代码、进入syscall、在内核中阻塞“慢速”syscall和从syscall返回用户空间时生效。

通过检查指令指针和指令指针周围的指令,您通常可以确定进程是否正在执行用户空间代码,但仅此而已。

但是,由于停止点本质上是随机的,所以可以等待进程停止,然后使用PTRACE_SINGLESTEP单步执行每个线程,直到指令指针发生变化。然后,您就知道线程正在执行用户空间代码。

或者,如果单步导致线程阻塞很长时间,这意味着线程正在执行一个正在阻塞的缓慢系统调用。

换句话说,如果我使用PTRACE_SYSCALL重新启动tracee,如何知道下一个syscall-停止是syscall-输入-停止还是syscall-退出-停止?

你不知道,除非你知道tracee停下来的州。正如我前面提到的,您可以通过单步执行代码来做到这一点,直到指令指针改变为止。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52056385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档