我一直在使用 oprofile 试图找出为什么我的程序在内核中花费了这么多时间。我现在有来自内核的符号,但显然我的程序和内核之间没有链接可以告诉我我的程序的哪些部分花费了这么长时间。
samples % image name app name symbol name
-------------------------------------------------------------------------------
201 0.8911 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock_irq
746 3.3073 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic rb_get_reader_page
5000 22.1671 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic default_spin_lock_flags
16575 73.4838 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic _raw_spin_lock
22469 11.1862 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock
22469 99.6010 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic __ticket_spin_lock [self]
26 0.1153 vmlinux-3.0.0-30-generic vmlinux-3.0.0-30-generic ret_from_intr
我从这里去哪里?如何发现程序中导致 __ticket_spin_lock 的位置?

你可以说调用树会看到这一点。好吧,这就是你如何欺骗调用树的方法。A 将所有时间都花在调用 C 上。现在,如果 A 调用 B1、B2、... C 是隐藏的。
还有许多其他完全普通的编程实践会混淆这些工具,特别是当样本深度为 10-30 层且功能都很少时,但程序员仔细检查适量样本时无法隐藏这些关系。