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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在内核空间中显示远程线程的回溯相关的知识,希望对你有一定的参考价值。

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

例如,获取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和许多关于线程的其他信息,但是我如何观察线程的回溯?

答案

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

showactstack <activation>

其中<activation>是线程地址(指针值,而不是ID),例如, showactstack 0xffffff8007acf098

另请注意以下有用的命令:

showtaskstacks <task address>
showtaskstacks -F <taskname>

这些显示了与任务/进程相对应的所有堆栈。

showallstacks

这将打印系统中所有线程的内核堆栈。请注意:这个可能需要一段时间才能完成。 (IIRC它比Firewire更快,而不是以太网kdp,但仍然需要几分钟。)

以上是关于在内核空间中显示远程线程的回溯的主要内容,如果未能解决你的问题,请参考以下文章

Windows内核之线程简单介绍

Windows内核之线程简单介绍

远程线程注入代码

线程是不是占用其独立的内核空间?

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

缓冲区溢出攻击