perfを使っていくつかのレジスタをサンプリングしたいときは、カーネルを再コンパイルしないでください。私が理解しているように、カーネルには独自のレジスタセットがあり、ユーザーR11は上書きされません。 syscall
インターフェイスには変更できない固定レジスタがいくつかあります(異なるregを試すことができますか?)いくつかの追加レジスタを使用するsyscallへのglibcゲートウェイが頻繁にあります(カーネルにはなくユーザ空間コードです。またはアセンブラで書かれている)。 gdbを使って誰がそれをしたのかを見つけるためにレジスタを監視してみてください。それはこれを行うことができます(うーん、SOの同じユーザーへのリンクをもう1つ):gdb: breakpoint when register will have value 0xffaagdb ./program
のように、次にgdbコマンドstart; watch $r11; continue; where
のように。
二週間の年齢PERFでレジスタ値のサンプリングについての質問perf-report show value of CPU registerがあった:
私はthis documentに従い、追加のCPUがPEBSレコードとの情報を登録しログインしようとし、--intr-regs=ax,bx,r15
でperf record
を使用しては。
x86 & PEBSがある間、ARMには--intr-regs
も実装されている可能性があります。 perf record --intr-regs=\?
(man perf-record: "利用可能なレジスタを一覧表示するには--intr-regs=\?
を使用する")の出力をチェックしてサポート状況とレジスタ名を確認してください。
レジスタを印刷するには、perf script -F ip,sym,iregs
コマンドを使用します。例では、一部のLinuxでありましたがコミット:あなたは金属製CPUの活動へのサイクル精度のプロファイルが必要な場合、それはせいぜい近似であるとして、その後PERFは、右のツールではありません
# 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イベントをトリガーする頻度を知ることができます(正確にはどのループで発生したか)。 –