2010-06-16 78 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(); 
} 

編輯:但要注意,此解決方案,功能樣機的所有聲明應定義宏之前完成。否則,您還將在預處理中擴展原型。

相關問題