我想跟踪对特定库的函数调用,将其称为 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
Run Code Online (Sandbox Code Playgroud)
然后您可以使用?来查看您可以在界面中执行哪些操作;您可以使用 放大符号d。您可以浏览符号映射的详细信息以查看进程的确切调用。
您可能想要聚合数据;您可以使用perf record来代替perf top.
您还可以使用其他工具,例如SystemTap实际的调试器。