perf列印呼叫棧的過程

2022-04-13 20:59:32 字數 2402 閱讀 7594

perf_prepare_sample-->perf_callchain-->get_perf_callchain

上面的呼叫棧會使用

perf_event_output-->

0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel]

0xffffffff81183a1f : __perf_event_overflow+0x1af/0x1d0 [kernel]

0xffffffff81183c1a : perf_swevent_overflow+0x9a/0xc0 [kernel]

0xffffffff81183c9d : perf_swevent_event+0x5d/0x80 [kernel]

0xffffffff81183e5c : perf_tp_event+0x19c/0x1b0 [kernel] 這個函式第一次有了regs

0xffffffff811620fb : perf_syscall_enter+0x1db/0x1f0 [kernel]

0xffffffff81003b7b : syscall_trace_enter_phase2+0x1cb/0x1e0 [kernel]

0xffffffff818245cb : tracesys_phase2+0x2d/0x8d [kernel]

對呼叫棧的一些理解,首先如果棧採集在使用者態的話,那麼肯定是沒有核心棧的,但是如果是才加到核心態的話,那麼可能是有使用者態的棧的,但是對於系統程序來說,同樣是沒有使用者態的棧的。怎麼判斷是在使用者態還是核心態,是指取樣點所位於的函式位置,

0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel]

0xffffffff81183a1f : __perf_event_overflow+0x1af/0x1d0 [kernel]

0xffffffff811844d4 : perf_event_overflow+0x14/0x20 [kernel]

0xffffffff8100fd7e : __intel_pmu_pebs_event+0x1ee/0x240 [kernel]

0xffffffff8100ff55 : intel_pmu_drain_pebs_nhm+0x185/0x350 [kernel]

0xffffffff8100c549 : intel_pmu_handle_irq+0x279/0x460 [kernel]

0xffffffff810056bd : perf_event_nmi_handler+0x2d/0x50 [kernel]

0xffffffff810323a9 : nmi_handle+0x69/0x120 [kernel]

0xffffffff810328e0 : default_do_nmi+0x40/0x100 [kernel]

0xffffffff81032a82 : do_nmi+0xe2/0x130 [kernel]

0xffffffff81826906 : nmi+0x56/0xa5 [kernel]

tracepoint事件

0xffffffff811837f0 : perf_event_output+0x0/0x80 [kernel]

0xffffffff81183a1f : __perf_event_overflow+0x1af/0x1d0 [kernel]

0xffffffff81183c1a : perf_swevent_overflow+0x9a/0xc0 [kernel]

0xffffffff81183c9d : perf_swevent_event+0x5d/0x80 [kernel]

0xffffffff81183e5c : perf_tp_event+0x19c/0x1b0 [kernel]  

0xffffffff810a7bb6 : perf_trace_sched_switch+0x166/0x190 [kernel]    vim include/trace/perf.h +32

0xffffffff8181fdd7 : __schedule+0x427/0xa10 [kernel]

0xffffffff818203f5 : schedule+0x35/0x80 [kernel]

0xffffffff818238e5 : schedule_hrtimeout_range_clock+0xc5/0x1b0 [kernel]

x86的中斷暫存器

regs是在perf_fetch_caller_regs(在perf_trace_sched_switch函式中)中獲取ip,cs,bp,sp是最重要的三個暫存器,其中cs暫存器來表明當前是在核心態還是使用者態,ip是當前在執行的指令,bp是棧指標暫存器。這裡是返回核心態, tracepoint都是返回核心態,有了cs,bp,sp就足夠拿到函式的呼叫棧了,核心態和使用者態有各自的unwind的方法。所有的tracepoint都是在核心態,

列印函式呼叫棧

我有時候對於程式呼叫不明顯的時候,看程式很費勁,這時候我們希望把程式呼叫鏈列印出來。對於庫函式提供了執行緒介面。backtrace backtrace symbols backtrace symbols fd 其實網上的教程都是結合這個示例寫的。我的也不例外。直接上核心部分,如果你想看func 1的...

函式呼叫的過程 棧

根據不同的 作業系統,乙個程序可能被分配到不同的記憶體區域去執行。但是不管什麼樣的作業系統 什麼樣的計算機 架構,程序使用的記憶體都可以按照功能大致分為以下4個部分 1 區 這個區域儲存著被裝入執行的二進位制機器 處理器會到這個區域取指並執行。2 資料區 用於儲存全域性變數等。3 堆區 程序可以在堆...

linux下列印呼叫棧

include include include include stacktrace.h 列印呼叫棧的最大深度 define dump stack depth max 16 列印呼叫棧函式 void dump trace char stack strings null int stack depth...