【问题标题】:How does strace connect to an already running process?strace 如何连接到已经运行的进程?
【发布时间】:2011-11-20 21:03:15
【问题描述】:

我知道strace 使用ptrace 来完成这项工作,

但它需要在TRACE_ME开启的情况下运行目标进程,

不适用于已运行进程的情况。

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

【问题讨论】:

    标签: strace


    【解决方案1】:

    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.)
    

    还有更多..

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

    Ctrl-C 中止 strace 跟踪。

    输入strace -h,查看帮助部分以获取关于strace的简短摘要 和 ma​​n 页面了解详细信息。

    注意:被跟踪的进程运行缓慢。

    【讨论】:

    • 问题肯定是问“'attach' 的魔力是如何工作的?”不是“调用魔法的命令开关是什么?”
    • @TomGoodfellow 没有魔法,只有我提到的带有其他选项的命令。请阅读问题并再次回答。不知道你没看懂哪一部分。
    • 这是一个问题:“我确实知道 strace 使用 ptrace 来完成这项工作,但它需要在 TRACE_ME 上运行目标进程......” - 这是一个关于 ptrace 实现的问题( )(以及 strace 如何使用它),而不是关于使用 strace 命令的问题。
    • 标题是“strace 是如何连接...”的,我已经基于此回答了关于 ptrace 的问题,而 ptrace 使用 TRACE_ME 我不知道,甚至 wiki、手册页或任何其他来源都没有不要说与这些有关的任何事情。所以无法评论 ptrace 内部所做的真实性。
    • 这不能回答问题。问题在于 strace 如何使用 ptrace 连接到已经运行的进程;提问者并不关心如何使用 strace 连接到已经运行的进程,而是他们想知道 strace 是如何连接的。马修的回答正确回答了这个问题。
    【解决方案2】:

    ptrace() 的详细信息因操作系统而异。

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

    请参阅Linux ptrace(2) man page(如果您真的想要详细信息,请参阅strace source,以及从kernel/ptrace.c 开始的内核源代码)。

    【讨论】:

      猜你喜欢
      • 2017-02-03
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 2010-10-12
      • 1970-01-01
      相关资源
      最近更新 更多