2012-08-03 26 views
0

我們有一個多線程的C++應用程序編譯與嵌入式powerpc上運行的g ++。爲了在持續集成測試中對內存泄漏進行測試,我們創建了一個堆分析器,並使用ld_preload加載。應LD_PRELOAD加載模塊或只是使用模塊來替換符號

我們希望保證ld_preloaded模塊中的函數在發生任何事情之前被調用(包括創建靜態對象等)。更重要的是,我們希望在進程退出之前調用另一個函數,以便堆分析器可以輸出結果。我們看到的問題是,在我們的ld_preloaded模塊中發生任何事情之前,我們的應用程序中的矢量正在全局文件範圍內創建。主矢量內的矢量增長。在關閉之前,我們預加載的模塊中的destructor函數在矢量被銷燬之前被調用。

有沒有什麼辦法可以編寫一個預先加載的模塊,在其他任何事情之後運行一個函數?我們嘗試過使用__attribute__((constructor))destructor,但沒有成功。

回到問題標題,我開始懷疑ld僅在爲後續模塊加載解析符號時纔在預加載模塊中查找。它實際上並未實際加載預先加載的模塊。任何人都可以爲我們解釋這一點嗎?

回答

1

最初,您將無法控制來自不同翻譯單元的構造函數的順序。所以,這也延伸到共享庫。

但是,GCC的較新版本支持將優先級參數應用於constructor屬性,該屬性應該允許您控制何時將指定的函數與其他全局構造函數相關地運行。未指定時的默認優先級是最大優先級值。所以你在下面設置的任何優先級應該使你的構造函數在它們之前運行,並且你的析構函數在它們之後運行。

static int initialize() __attribute__((constructor(101))); 
static int deinitialize() __attribute__((destructor(101))); 

static int initialize() { 
    puts("initialized"); 
} 

static int deinitialize() { 
    puts("deinitialized"); 
} 

101似乎是允許指定的最低優先級別。 65535是最高的。較低的數字首先執行。

+0

不幸的是這並沒有任何影響。進一步閱讀似乎表明,對C++應用程序的真正入門點有永無止境的追求。 – Fenster34 2012-08-09 20:32:44

+1

對不起,它沒有工作。我只能爲你建議一個解決方法。如果你動態地分配你的堆分析器,它永遠不會被銷燬。如果它在內存映射文件中保持其狀態,則可以稍後在程序結束時分析該文件。 – jxh 2012-08-10 01:51:02

+0

這是一個偉大的想法,因爲它始終保證工作。我們選擇修改我們的代碼以避免這個問題,但我會將其記錄爲未來的增強版。謝謝 – Fenster34 2012-08-10 21:25:38