ltracing共享库,如何?

ltracing共享库,如何?

我想跟踪对特定库的函数调用,将其称为 libfoo。不幸的是,我找到的有关它的文档很少,所以我有很多问题。

在 libfoo 的文档中,它将调用 foo_a、foo_b、foo_c .. 列为 api 调用。在 Windows DLL 中,生成这样的调用列表很容易,每个外部调用都必须如此声明(dllexport(DLL) 或类似的东西),一个简单的脚本将提取所有导出的符号。我将如何为 Linux 共享对象生成这样的列表。

一旦生成这样的列表,我如何将它与 ltrace 一起使用来生成使用特定程序的调用的跟踪。另外,如何扩展这些调用中的 ( C ) 字符串参数?

答案1

您可以使用一些工具来执行此操作;立即可用的是perf.

假设我想实时查看 Firefox 进程的情况;我可以perf top -p <pidof firefox>;您将看到如下输出:

Samples: 802  of event 'cycles', Event count (approx.): 374901537                                                
Overhead  Shared Object                Symbol                                                                    
   1.29%  libpthread-2.21.so           [.] pthread_mutex_unlock
   1.12%  [kernel]                     [k] ksize
   0.84%  firefox                      [.] 0x0000000000012bcc
   0.71%  libpthread-2.21.so           [.] pthread_mutex_lock
   0.64%  [kernel]                     [k] flat_send_IPI_mask
   0.63%  firefox                      [.] 0x0000000000012bdd
   0.61%  libmozsqlite3.so             [.] 0x000000000000cfd0
   0.60%  [kernel]                     [k] page_fault
   0.60%  libxul.so                    [.] 0x000000000233fa58
   0.56%  [kernel]                     [k] nf_nat_ipv4_local_fn

然后您可以使用?来查看您可以在界面中执行哪些操作;您可以使用 放大符号d。您可以浏览符号映射的详细信息以查看进程的确切调用。

您可能想要聚合数据;您可以使用perf record来代替perf top.

您还可以使用其他工具,例如SystemTap实际的调试器。

相关内容