如何使用perf从剥离的二进制文件中获取完整的堆栈跟踪?

时间:2015-05-11 16:18:54

标签: linux profiling stack-trace debug-symbols perf

我正在尝试分析为嵌入式Linux系统编写的进程。这是我们正在开发的产品。进程名称设置为" dummy"出于保密原因。有人建议我用perf来剖析假人。所以我尝试了一堆不同的perf命令,以便了解在dummy中定义的内部函数在热区中以及我们如何调用libc和libglib中的内容。这是假人在99%CPU下运行时的perf top示例。它以" perf top -G -p"

运行
+  13.75%  libc-2.18.so             [.] 0x000547a2                                                                         
+   7.52%  [kernel]                 [k] __do_softirq                                                                       
+   6.97%  libglib-2.0.so.0.3600.4  [.] 0x00089d60                                                                         
+   2.87%  libpthread-2.18.so       [.] 0x000085c4                                                                         
+   2.71%  libpthread-2.18.so       [.] pthread_mutex_lock                                                                 
+   2.62%  libc-2.18.so             [.] malloc                                                                             
+   2.51%  [kernel]                 [k] vector_swi                                                                         
+   1.87%  [kernel]                 [k] _raw_spin_unlock_irqrestore                                                        
+   1.49%  [kernel]                 [k] __getnstimeofday                                                                   
+   1.45%  dummy                    [.] chksum_crc32_int                                                                   
+   1.34%  [kernel]                 [k] fget_light                                                                         
+   1.29%  [kernel]                 [k] _raw_spin_unlock_bh                                                                
+   1.28%  [kernel]                 [k] memcpy                                                                             
+   1.24%  [adkNetD]                [k] adk_netd_clean_nca_queue         
.
.
.

即使我有一些想法,我也完全不理解输出。所以这是我的问题。

  1. 最后一栏表示什么?是不是在左边列出的二进制文件或库中调用的函数?
  2. 那么这是否意味着第一行中的0x000547a2是进程libc中定义的符号/函数?
  3. 由于目标产品上的所有库和二进制文件都被剥离,我可以理解perf无法显示具有实际函数名称的已解析堆栈跟踪。但我在为libc单独构建的调试符号文件中搜索了0x000547a2(与libc一起提供),但我找不到该符号。我能找到的最接近的是
  4. 00054750 t _int_malloc

    1. 有没有办法可以指定我必须执行的调试符号文件?

0 个答案:

没有答案