gpt4 book ai didi

macos - 我如何知道谁在 macOS 上调用了该进程?

转载 作者:行者123 更新时间:2023-12-04 08:15:52 27 4
gpt4 key购买 nike

macOS 上的一个身份不明的进程会定期在我的“下载”文件夹中创建一个空的临时文件,但稍后不会将其删除
我设法找出直接的罪魁祸首是 mktemp ,但我想了解哪个进程调用它
我想我可以使用 $ lldb > process attach -name mktemp -watifor在启动时附加到 mktemp,但不知道如何知道谁首先调用它
是否有任何解决方案,无论是否有 lldb 知道它?

最佳答案

这实际上比您想象的要棘手一些。
您可以通过运行 ps -j <PID> 在 macOS 上轻松找到给定进程的父进程。虽然终端。父 pid 是输出中的第三列。或者 Activity Monitor 具有分层显示,以图形方式显示这些关系。
lldb 在附加时打印它所附加的进程的 pid,或者您可以在 lldb 命令的输出中找到它 target list .所以很容易找到...
但是,由于技术原因,当调试器附加到一个进程时,该进程会被内核“重新父化”到调试器。所以如果你问一个在 lldb 下运行的进程它的父进程是谁,答案总是“debugserver”——它是 lldb 的调试器 stub 。并且没有一种简单的方法可以查看原始 parent 是什么。
我让这个工作,虽然这有点黑客。您想暂停正在调试的进程,以便它不会在您身上退出,然后与它分离,以便它重新回到真正的父级。所以:

  • 在 lldb 中,运行:

  • (lldb) expr (void) task_suspend((void *)mach_task_self())
    由于在返回之前暂停了任务,因此该命令实际上不会完成。所以
  • 在 lldb 控制台中使用 ^C 中断表达式计算。目标进程已经挂起,所以这只会取消 task_suspend 返回码。
  • 现在分离:

  • (lldb) 分离
    当您这样做时,系统将重新将 mktemp 进程重新分配回其原始父进程,
  • 现在你可以运行 ps -j在终端中找到您要查找的进程,它将是原始父进程。

  • 如果您需要再次运行该进程,请再次使用 lldb 附加到它并使用与您在上面调用 task_suspend 相同的参数调用 task_resume。

    关于macos - 我如何知道谁在 macOS 上调用了该进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65705640/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com