2010-06-16 80 views
1

我想跟踪调用某些由另一个第三方库制作的第三方库。是否可以将呼叫打包为静态链接的第三方库?

例如:我想追查到库A.调用我的应用程序静态链接库B,而这又是静态链接到库A.所以基本上我是libAB.a

在动态链接的情况下,我可以使用函数的封装器来编写库A2,以便我要跟踪库A并使用LD_PRELOAD = A2.so。然后,我的包装将被调用,而我会看到痕迹。 在我的情况下,我不能使用动态链接。

使用静态链接可以实现相同吗?

在理想的情况下,我想链接我的应用程序与libAB.a和跟踪库libA2.a并获得跟踪。

感谢,
罗布斯塔

回答

2

好吧,我发现它:)

男人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. 
+0

你为什么不接受你自己的答案? :) – 2012-07-07 01:34:13

0

根据多少性能重要的,你可以用gdb做到这一点...(设置在所有你关心和日志堆栈跟踪功能的断点...但是,这涉及到学习

如何编写脚本GDB)还有东西像OProfile的http://oprofile.sourceforge.net/,LTTng http://lttng.org/和PERF(附带了它的下工具/ PERF内核源代码最新的内核/你需要编译它,在Ubuntu我认为这是在linux-tools包)

我不能告诉你如何使用任何这些工具来实现你想要的,但是oprofile和LTTng有很多文档和一个活跃的用户社区。

0

嗯,这似乎是一个死循环:)

但我认为你可以使用宏解决它。尽管此解决方案可能不够干净,可能无法适用于所有情况。

你可以试试这个:

void functionFromLibA(); 
#define functionFromLibA() trace(); functionFromLibA() 
int main() 
{ 
    functionFromLibA(); 
} 

这将扩大到:

void myfunc(); 
int main() 
{ 
trace(); functionFromLibA(); 
} 

编辑:但要注意,此解决方案,功能样机的所有声明应定义宏之前完成。否则,您还将在预处理中扩展原型。

相关问题