我想跟踪对特定库的函数调用,将其称为 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
实际的调试器。