附加到进程后,如何检查tracee是否在系统调用中?

根据the ptrace manual page

Syscall-enter-stop and syscall-exit-stop are indistinguishable from
each other by the tracer. The tracer needs to keep track of the
sequence of ptrace-stops in order to not misinterpret syscall-enter-
stop as syscall-exit-stop or vice versa.

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

最佳答案

When I attach to a process using PTRACE_ATTACH,how do I know whether the tracee is currently in a syscall or not?

使用PTRACE_ATTACH连接到进程时,将向tracee发送STOP信号.

STOP信号在执行用户空间代码时,进入系统调用时生效,同时在内核中“慢速”系统调用中阻塞,以及从系统调用返回用户空间时生效.

通过检查指令指针和指令指针周围的指令,您通常可以确定进程是否正在执行用户空间代码,但这是关于它的.

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

或者,如果单步执行导致线程长时间阻塞,则意味着线程正在执行阻塞的慢速系统调用.

Put differently,if I restart the tracee using PTRACE_SYSCALL,how do I know whether the next syscall-stop is a syscall-enter-stop or a syscall-exit-stop?

你没有,除非你知道tracee停止的状态.如上所述,您可以通过单步执行代码来执行此操作,直到指令指针发生更改.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...