我們有一個多線程的C++應用程序編譯與嵌入式powerpc上運行的g ++。爲了在持續集成測試中對內存泄漏進行測試,我們創建了一個堆分析器,並使用ld_preload
加載。應LD_PRELOAD加載模塊或只是使用模塊來替換符號
我們希望保證ld_preloaded
模塊中的函數在發生任何事情之前被調用(包括創建靜態對象等)。更重要的是,我們希望在進程退出之前調用另一個函數,以便堆分析器可以輸出結果。我們看到的問題是,在我們的ld_preloaded
模塊中發生任何事情之前,我們的應用程序中的矢量正在全局文件範圍內創建。主矢量內的矢量增長。在關閉之前,我們預加載的模塊中的destructor
函數在矢量被銷燬之前被調用。
有沒有什麼辦法可以編寫一個預先加載的模塊,在其他任何事情之後運行一個函數?我們嘗試過使用__attribute__((constructor))
和destructor
,但沒有成功。
回到問題標題,我開始懷疑ld
僅在爲後續模塊加載解析符號時纔在預加載模塊中查找。它實際上並未實際加載預先加載的模塊。任何人都可以爲我們解釋這一點嗎?
不幸的是這並沒有任何影響。進一步閱讀似乎表明,對C++應用程序的真正入門點有永無止境的追求。 – Fenster34 2012-08-09 20:32:44
對不起,它沒有工作。我只能爲你建議一個解決方法。如果你動態地分配你的堆分析器,它永遠不會被銷燬。如果它在內存映射文件中保持其狀態,則可以稍後在程序結束時分析該文件。 – jxh 2012-08-10 01:51:02
這是一個偉大的想法,因爲它始終保證工作。我們選擇修改我們的代碼以避免這個問題,但我會將其記錄爲未來的增強版。謝謝 – Fenster34 2012-08-10 21:25:38