2017-12-27 428 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