我試圖用LD_PRELOAD攔截PyDict_New函數。我已經驗證了this recipe在python解釋器中使用了getpid,而我已經使用adapted it to use PyDict_New,但它並不像我期望的那樣工作。雖然我明確分配字典,並且必須使用此函數,但我的覆蓋不會被調用。不能攔截PyDict_New與LD_PRELOAD
我在做什麼錯?
背景:我試圖在一個非常大的系統中調試問題。我發現有一個引用計數不好的字典。我知道字典首先分配的位置,以及問題出現的位置,但我很確定在某個中間時間計數會變差,並且一個簡單的代碼跟蹤不會執行,因爲該字典被緩存並重新使用(通過PyDict_New)由gc系統。
你是什麼意思「自己動態加載」。 LD_PRELOAD不會在不使用-Bsymbolic編譯的共享庫中重寫全局函數嗎? – 2011-12-26 06:23:03
我指的是可執行文件中的符號不是由ld.so動態加載的。由於它們沒有被ld.so加載,LD_PRELOAD根本就沒有被使用。在這種情況下,OP想要覆蓋的函數被編譯到python可執行文件中,而不是由ld.so從任何共享庫加載。在提供的解決方案中,所有的python都是從libpython2.7.so動態加載的,所以LD_PRELOAD可以工作。至於-Bsymbolic,我的理解是唯一的影響是讓一個庫首先選擇自己的符號,而不是首先查看可執行文件。 – 2011-12-28 15:58:29
我需要嘗試一下。 – bukzor 2011-12-29 20:14:11