strace如何连接到已经运行的进程?

new*_*erl 30 strace

我知道strace使用ptrace做的工作,

但它需要运行目标进程TRACE_ME,

不适用于已经运行的流程的情况.

它如何在已经运行的进程上工作?

Pra*_*ngh 26

strace -p <PID> ---->将一个进程附加到strace."-p"选项用于进程的PID.

strace -e trace=read,write -p <PID> - >通过这个,您还可以跟踪事件的进程/程序,例如读取和写入(在此示例中).因此,它将打印所有此类事件,包括进程的读写系统调用.

其他这样的例子

-e trace= network  (Trace all the network related system calls.)

-e trace=signal    (Trace all signal related system calls.)

-e trace=ipc       (Trace all IPC related system calls.)

-e trace=desc      (Trace all file descriptor related system calls.)

-e trace=memory    (Trace all memory mapping related system calls.)
Run Code Online (Sandbox Code Playgroud)

还有很多..

trace是可以与 -e选项一起使用的众多选项之一.

Ctrl-C以strace方式进行跟踪.

通过键入 和手册页查看帮助部分有关strace的简要摘要以获取详细信息.strace -h

注意:跟踪过程运行缓慢.

  • 当然,问题是"'附加'的魔力如何发挥作用?" 不是"什么命令切换来调用魔法?" (12认同)
  • 这并不能回答问题。问题关心 strace 如何使用 ptrace 连接到已经运行的进程;提问者并不关心如何使用 strace 连接到已经运行的进程,而是想知道 strace 如何连接。马太的回答正确地回答了这个问题。 (5认同)
  • 这是那个问题:“我确实知道 strace 使用 ptrace 来完成这项工作,但它需要运行带有 TRACE_ME 的目标进程...” - 这是一个关于 ptrace() 实现的问题(以及 strace 如何使用它) ,不是关于使用 strace 命令的问题。 (2认同)

Mat*_*ery 14

详细信息ptrace()是特定于操作系统的.

在Linux上,孩子可以请求由其父母跟踪ptrace(PTRACE_TRACEME, ...); 但是,或者,一个进程可以将自己附加到另一个进程ptrace(PTRACE_ATTACH, ...).

请参阅Linux ptrace(2)手册页(如果您真的需要精细的详细信息,strace源代码和内核源代码,请参阅kernel/ptrace.c).

  • 虽然另一个答案很详细并且对某些搜索者有帮助,但它实际上并没有回答原始问题,这个应该是公认的答案 (2认同)