1

我有kcore,我想從kcore獲取用戶空間回溯。因爲我們應用程序中的某個人正在製作大量的munmap並使系統掛起(CPU軟鎖定22s!)。我看了一下macro,但這仍然只是給我內核回溯。我想要的是用戶空間回溯。從task_struct獲取用戶stackpointer

好消息是我有指向task_struct的指針。

task_struct->thread->sp (Kernel stack pointer) 
task_struct->thread->usersp (user stack pointer) but this is junk 

我的問題是如何從kcore或task_struct獲取用戶空間回溯。

回答

0

首先,vmcore通常爲不包含用戶頁面。我並不知道任何有助於在這裏獲得幫助的魔法 - 您必須檢查給定任務地址空間的vm映射,然後檢查物理頁面,我非常懷疑調試器知道如何去做。

但最重要的是,您可能沒有任何合理的理由來做到這一點。

那麼,你想達到什麼目的?

=======================

鑑於編輯:

從我們的應用程序有一個人正在大量munmap並使 系統掛起(CPU軟鎖定22s!)。

可能有也可能不存在必須調試的實際內核問題。雖然我沒有看到用戶空間堆棧跟蹤的任何用處。

所以據我所知推測問題是從應用程序過多的mmap + munmap調用。檢查跟蹤鎖定報告的線程的回溯可能會或可能不會發生,以趕上罪魁禍首。你真正想要的是收集/所有/呼叫者的回溯,並按頻率排序。這可以通過systemtap完成(雖然很痛苦)。

+0

更新問題,爲什麼我想要用戶空間stacktrace。 – eswaat

0

首先,vmcore是一個即時完整的內存快照,因此它包含所有頁面(包括用戶頁面)。但如果用戶頁面換出了,則無法訪問它們。所以這就是爲什麼kdump(和gdb python腳本類似的工具)只關注內核調試功能。對於用戶空間調試和堆棧跟蹤,您必須使用coredump功能。默認情況下,內核是在內核向您的應用程序發送(例如)SIGSEGV時生成的,但您可以在需要時使用gcore修改內核來製作它。也有製作過程轉儲的「用戶空間」的方式,請參閱google coredumper項目

此外,您還可以嘗試直接從KCORE放鬆身心用戶堆棧跟蹤 - 但是這是一個取巧的辦法,你將不得不希望用戶空間堆棧跟蹤是目前沒有換出。 (你使用交換?)你可以看到__save_stack_trace_user,這將有助於如何檢索用戶空間上下文

+0

vmcores由makedumpfile創建,它支持跳過各種頁面,包括用戶空間的頁面。這種配置是例如CentOS的。在OP的情況下,用戶空間的coredump是沒有用的。最後,難點在於在閱讀用戶內容時擁有適當的地址空間 - 崩潰(調試器)可能會或可能不知道如何處理這個問題,我懶得去檢查。 –

+0

Alex對__save_stack_trace_user的解決方案看起來很合理。你知道如何從task_struct獲取struct stack_trace嗎? – eswaat

+0

@eswaat你爲什麼需要它?只需要struct pt_regs * regs = task_pt_regs(current);並繼續 –