我想跟踪来自其他第三方库的第三方库的调用。
示例:我想跟踪对库A的调用。我的应用程序静态链接库B,库B又静态链接到库A.所以基本上我所拥有的是libAB.a
在动态链接的情况下,我可以编写库A2,包含我想跟踪库A的函数的包装器,并使用LD_PRELOAD = A2.so。然后,我的包装将被调用,我将看到跟踪。 在我的情况下,我不能使用动态链接。
是否可以使用静态链接实现相同的目标?
在理想情况下,我想将我的应用程序与libAB.a和跟踪库libA2.a链接起来并获取跟踪。
谢谢,
罗布斯塔
答案 0 :(得分:2)
好的,我找到了它:)
man ld
--wrap symbol
Use a wrapper function for symbol. Any undefined reference to symbol will be resolved to "__wrap_symbol". Any undefined ref‐
erence to "__real_symbol" will be resolved to symbol.
This can be used to provide a wrapper for a system function. The wrapper function should be called "__wrap_symbol". If it
wishes to call the system function, it should call "__real_symbol".
Here is a trivial example:
void *
__wrap_malloc (size_t c)
{
printf ("malloc called with %zu\n", c);
return __real_malloc (c);
}
If you link other code with this file using --wrap malloc, then all calls to "malloc" will call the function "__wrap_malloc"
instead. The call to "__real_malloc" in "__wrap_malloc" will call the real "malloc" function.
答案 1 :(得分:0)
根据性能的重要性,您可以使用gdb ...(在您关心的所有函数上设置断点并记录堆栈跟踪......但这涉及学习如何编写gdb脚本)
还有Oprofile http://oprofile.sourceforge.net/,LTTng http://lttng.org/和perf(内核源代码中的最新内核,你需要编译它的工具/ perf /,在Ubuntu上,我认为它在linux-tools包)
我不能告诉你如何用这些工具实现你想要的东西,但oprofile和LTTng有很多文档和活跃的用户社区。 p>
答案 2 :(得分:0)
好吧,这似乎是一个死锁:)
但我认为你可以用宏来解决它。虽然此解决方案可能不干净,但可能无法适用于所有情况。
你可以试试这个:
void functionFromLibA();
#define functionFromLibA() trace(); functionFromLibA()
int main()
{
functionFromLibA();
}
这将扩展为:
void myfunc();
int main()
{
trace(); functionFromLibA();
}
编辑:但请注意,对于此解决方案,应在定义宏之前完成函数原型的所有声明。否则,您将在预处理中扩展原型。