當你只是想用perf來取樣一些寄存器時,你不應該嘗試重新編譯內核。據我所知,內核擁有自己的一組寄存器,不會覆蓋用戶R11。 syscall
接口使用了一些固定的寄存器,這些寄存器是不能改變的(你可以嘗試不同的寄存器嗎?),並且通常有glibc網關給系統調用,這可能會使用一些額外的寄存器(它們不在內核中,它們是用戶空間代碼;或用匯編寫成)。您可以嘗試使用gdb來監視寄存器以更改以查找是誰執行的。它可以做到這一點(嗯,多一個鏈接到SO上的同一用戶):gdb: breakpoint when register will have value 0xffaa像gdb ./program
然後gdb命令start; watch $r11; continue; where
。
兩個星期的年齡有問題perf-report show value of CPU register約寄存器的值與採樣PERF:
我跟着this document和使用perf record
與--intr-regs=ax,bx,r15
,嘗試登錄額外的CPU註冊PEBS記錄信息。
雖然有PEBS,但是ARM也可能有--intr-regs
。檢查輸出perf record --intr-regs=\?
(man perf-record:「列出可用的寄存器使用--intr-regs=\?
」)來查找支持狀態和註冊名稱。
要打印寄存器,請使用perf script -F ip,sym,iregs
命令。有一些Linux的例子承諾:
# perf record --intr-regs=AX,SP usleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.016 MB perf.data (8 samples) ]
# perf script -F ip,sym,iregs | tail -5
ffffffff8105f42a native_write_msr_safe AX:0xf SP:0xffff8802629c3c00
ffffffff8105f42a native_write_msr_safe AX:0xf SP:0xffff8802629c3c00
ffffffff81761ac0 _raw_spin_lock AX:0xffff8801bfcf8020 SP:0xffff8802629c3ce8
ffffffff81202bf8 __vma_adjust_trans_huge AX:0x7ffc75200000 SP:0xffff8802629c3b30
ffffffff8122b089 dput AX:0x101 SP:0xffff8802629c3c78
#
根據所使用的調用約定,甚至可能無法重新編譯內核,以便在不破壞某些內容的情況下不使用R11。你真的想做什麼? – tangrs
嗨,謝謝。我想使用perf的記錄來知道我的程序觸發perf事件的頻率(以及確切發生在哪個循環數)。 –