C++ perf如何处理示例内核堆栈?

C++ perf如何处理示例内核堆栈?,c++,perf,C++,Perf,据我所知,perf能够为每个进程/线程采样一个完整的调用堆栈,即使它当前在内核中。由于perf在用户空间中运行,我想知道它是如何访问不同进程/线程堆栈的内核部分的 其目的是编写一个应用程序,该应用程序可以对其他进程/线程的调用堆栈进行采样,即使它们当前位于内核中 性能方面由两部分组成。用户空间工具和perf\u事件\u打开syscall 通常,堆栈采样由内核通过系统调用完成。您也可以使用编写应用程序-默认情况下包含内核示例(exclude\u kernel==0)。根据手册,我必须设置perf\

据我所知,perf能够为每个进程/线程采样一个完整的调用堆栈,即使它当前在内核中。由于perf在用户空间中运行,我想知道它是如何访问不同进程/线程堆栈的内核部分的

其目的是编写一个应用程序,该应用程序可以对其他进程/线程的调用堆栈进行采样,即使它们当前位于内核中


性能方面由两部分组成。用户空间工具和
perf\u事件\u打开
syscall


通常,堆栈采样由内核通过系统调用完成。您也可以使用编写应用程序-默认情况下包含内核示例(
exclude\u kernel==0
)。

根据手册,我必须设置perf\u event\u attr结构的参数,然后在perf\u event\u open的情况下打开文件描述符,然后通过read继续从中读取。假设我的目标是获取挂起进程的调用堆栈,我应该订阅哪些事件类型,以及如何从read解析数据?您可以读取,也可以
mmap
。要获取调用堆栈,您可以设置如下内容:attr.sample\u type=PERF\u sample\u IP | PERF\u sample\u TID | PERF\u sample\u TIME | PERF\u sample\u CPU | PERF\u sample\u CALLCHAIN。例如,您可以使用
PERF\u TYPE\u硬件
/
PERF\u COUNT\u HW\u CPU\u CYCLES
。PERF\u COUNT\u HW\u CPU\u CYCLES将生成多少事件?每次CPU做什么事情?对进程调度事件进行采样是否更便宜?记录速率由相应地设置
attr.sample\u period
attr.sample\u freq
attr.freq
决定。手册页包含了所有细节。注意:这是一项相当复杂的工作,我无法在答案中加入完整的教程,但我很乐意回答更多的具体问题。