1

我是新手,

尝试理解结果,但如何阅读这样的内容?

 39.57%  TestSoft.exe  libc-2.15.so         [.] 0x3fd59
  7.04%  TestSoft.exe  libc-2.15.so         [.] malloc
  6.15%  TestSoft.exe  LoanSoft.exe         [.] LoanDef::update_vec()

第一行可能是 libc 中的某个函数,但它是哪个函数?0x3fd59 是什么意思?另外,对于第二行,我的代码中的哪个函数调用 malloc?对于第三行,我是否可以进一步对该函数进行 perf 以查看 update_vec() 的哪个部分很慢?

非常感谢!

4

2 回答 2

2

由于转储是用户模式下的所有函数,因此建议使用调试符号编译。0x3fd59 是由于缺少符号而无法获得实际名称的例程。
请参阅此处以在源代码级别进行分析。

 39.57%  TestSoft.exe  libc-2.15.so         [.] 0x3fd59
  7.04%  TestSoft.exe  libc-2.15.so         [.] malloc
  6.15%  TestSoft.exe  LoanSoft.exe         [.] LoanDef::update_vec()

首先表示在相应函数中采集的整体样本的百分比。

第二列报告收集样本的过程。

第三列显示了样本来自的 ELF 图像的名称。如果程序是动态链接的,那么这可能会显示共享库的名称。当样本来自内核时,使用伪 ELF 映像名称 [kernel.kallsyms]。

第四列表示获取样本的特权级别,即程序运行时中断时:

   [.] : user level
   [k]: kernel level
   [g]: guest kernel level (virtualization)
   [u]: guest os user space
   [H]: hypervisor

最后一列显示符号名称。

于 2012-08-18T20:21:42.117 回答
2

您需要使用调试符号进行构建(-g编译时传递给 g++ 的选项)。然后您将能够看到哪个函数使用了该 CPU 时间。您还需要使用带有调试符号的库。

于 2012-08-18T19:56:59.677 回答