代码之家  ›  专栏  ›  技术社区  ›  Zohar81

显示内核空间中远程线程的回溯跟踪

  •  1
  • Zohar81  · 技术社区  · 7 年前

    在内核空间中进行调试时,我有时希望根据线程组中的回溯帧来搜索线程,就像特定任务中的所有线程一样。

    例如,获取内核任务id

    (lldb) showalltasks
    task                 vm_map              ...command             
    0xffffff800d828550   0xffffff800a1038d8  ...kernel_task         
    

    正在转储属于kernel\u任务的所有线程

    (lldb) showtaskthreads 0xffffff800d828550
    task                 vm_map               ipc_space            #acts flags    pid       process             io_policy  wq_state  command
    0xffffff800d828550   0xffffff800a1038d8   0xffffff800d5d17c0     140            0   0xffffff8007abb460                -1 -1 -1    kernel_task         
    thread                   thread_id  processor            base   pri    sched_mode      io_policy       state    ast          waitq                            wait_event           wmesg                thread_name         
        0xffffff8007acf098       0x65       0xffffff8007a8a7b8   92     92     fixed bound                     WU       L            0xffffff804119e550               0xffffff8007a87a30 <vm_page_free_wanted>                                          
        0xffffff800d83f4c0       0x66       0xffffff8007a8a7b8   0      0      fixed bound                     RI       L                                                                                                           
        0xffffff800d83f958       0x67       0xffffff8041ad6000   95     95     fixed                           WU       L            0xffffff804119c240               0xffffff8007303840 <sched_timeshare_maintenance_continue>                      sched_maintenance_thread
        0xffffff800d83fdf0       0x68       0xffffff8041ad6000   80     80     fixed                           WU       L            0xffffff804119e850               0xffffff8007acf9f0                                            
        0xffffff800d83f028       0x69       0xffffff8007a8a7b8   93     93     fixed                           WU                    0xffffff804119e5e0               0xffffff8007acfa08                                            
    

    现在我可以看到线程id和关于线程的许多其他信息,但是我如何才能观察线程的回溯呢?

    1 回复  |  直到 7 年前
        1
  •  1
  •   pmdj    7 年前

    无论出于何种原因,xnu内核调试宏都使用“线程”和“激活”(缩写) act )讨论线程时的术语。有了这些信息,您将很快发现:

    showactstack <activation>

    哪里 <activation> 是线程 住址 (指针值,而非ID),例如。 showactstack 0xffffff8007acf098 .

    还要注意以下有用的命令:

    showtaskstacks <task address>
    showtaskstacks -F <taskname>
    

    这些节目 全部的 与任务/流程相对应的堆栈。

    showallstacks
    

    这将打印 全部的 系统中的线程。请注意:这可能需要一段时间才能完成。(IIRC通过Firewire比以太网kdp更快,但仍需要几分钟。)