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

我如何知道谁在macOS上调用该进程?,macos,lldb,Macos,Lldb,macOS上一个身份不明的进程会定期在“我的下载”文件夹中创建一个空临时文件,但以后不会将其删除 我设法找出了直接的罪魁祸首是mktemp,但我想知道哪个进程调用它 我想我可以在mktemp启动时使用$lldb进程attach-name mktemp-watifor来连接到mktemp,但不知道如何知道是谁首先调用了它 有没有任何解决方案,不管是否有lldb知道它?这实际上比你想象的要复杂一些 通过运行ps-jthrough-Terminal,您可以在macOS上轻松找到给定进程的父进程。父pi

macOS上一个身份不明的进程会定期在“我的下载”文件夹中创建一个空临时文件,但以后不会将其删除

我设法找出了直接的罪魁祸首是
mktemp
,但我想知道哪个进程调用它

我想我可以在mktemp启动时使用
$lldb
进程attach-name mktemp-watifor
来连接到mktemp,但不知道如何知道是谁首先调用了它


有没有任何解决方案,不管是否有lldb知道它?

这实际上比你想象的要复杂一些

通过运行
ps-j
through-Terminal,您可以在macOS上轻松找到给定进程的父进程。父pid是输出中的第三列。或“活动监视器”具有以图形方式显示这些关系的分层显示

lldb在附加时打印它所附加到的进程的pid,或者您可以在lldb命令的输出中找到它。所以这很容易找到

然而,由于技术原因,当调试器附加到进程时,该进程会被内核“重新分配”给调试器。因此,如果您询问在lldb下运行的进程其父进程是谁,答案总是“debugserver”-这是lldb的调试器存根。而且要想知道最初的父母是什么也不容易

我让它工作,虽然这是一个有点黑客。您希望挂起正在调试的进程,使其不会在您身上退出,然后从中分离,使其重新租回真正的父进程。因此:

  • 在lldb中,运行:
  • (lldb)expr(void)task_suspend((void*)mach_task_self())

    由于在返回之前暂停了任务,因此该命令实际上不会完成。所以

  • 在lldb控制台中使用^C中断表达式计算。目标进程已挂起,因此这将仅取消task_suspend返回代码

  • 现在分离:

  • (lldb)分离

    当您这样做时,系统会将mktemp进程重新租回其原始父进程

  • 现在,您可以在Terminal中运行
    ps-j
    ,找到您要查找的进程,它将是原始父进程

  • 如果需要重新运行该进程,请再次使用lldb连接到该进程,并使用与上面调用task\u suspend相同的参数调用task\u resume。

    感谢您提供了非常详细的答案!知道我如何为lldb提供mach.h的路径吗?当前正在运行
    expr(void)task\u suspend((void*)mach\u task\u self())
    抱怨
    mach\u task\u self
    task\u suspend
    作为未声明的标识符