2017-12-27 599 views
1

在内核空间中进行调试时,我有时希望根据线程组中的回溯帧搜索线程,如特定任务上的所有线程。显示内核空间中的远程线程的回溯

例如,获取kernel_task ID

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

转储全部线程属于kernel_task

(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和其他许多有关线程,但我怎么能观察线程的回溯?

+0

“我怎么看......,但我怎么能......?” - 你的意思是“** Now **我可以看到......但是我怎么能......?”代替? – Tsyvarev

+0

感谢您的更正:-) – Zohar81

回答

1

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

showactstack <activation>

哪里<activation>是线程地址(指针值,而不是ID),所以如showactstack 0xffffff8007acf098

还要注意以下有用命令:

showtaskstacks <task address> 
showtaskstacks -F <taskname> 

这些数据显示所有对应于任务/进程的堆栈。

showallstacks 

这将打印为系统中的所有线程的内核堆栈。被警告:这可能需要一段时间才能完成。 (IIRC在Firewire上比在以太网kdp上更快,但仍需要几分钟时间。)

+0

感谢您的帮助!顺便说一下,我几乎可以肯定这是不可能的,但是有没有一个lldb命令可以让你看到用户空间线程? – Zohar81

+0

我从来没有使用过它们,但你可以尝试'showtaskuserstacks' /'showthreaduserstack'。用“帮助”前缀来找出参数等。我怀疑那些棘手的事情会正确地查找符号。顺便说一下,大多数内核调试宏都以'show'开始,所以你可以通过输入'show'并按下tab来尝试自动完成,从而得到一个合适的列表。 – pmdj

+0

谢谢你,这些函数正在工作,但正如你所说,棘手的部分是找出地址,因为它们属于不同的映射。现在我正在寻求如何改变处理上下文以便从这些地址中获取符号。 – Zohar81