私はLD_PRELOADを使用してPyDict_New関数をインターセプトしようとしています。私はthis recipeがpythonインタプリタのgetpidで動作することを確認しましたが、代わりにadapted it to use PyDict_Newがありますが、期待通りに機能しません。私は辞書を明確に割り当てていますが、この関数を使用する必要がありますが、オーバーライドは呼び出されていません。はPyDict_NewをLD_PRELOADで傍受することはできません
私は間違っていますか?
背景:私は非常に大きなシステムで問題をデバッグしようとしています。私は、不正な参照カウントを持つdictがあることを発見しました。私はdictが最初に割り当てられた場所とどこに問題が現れているのかを知っていますが、いくつかの中間時間ではカウントが悪くなることは確かです。単純なコードトレースはキャッシュされ再利用されません(PyDict_Newを介して)gcシステムによって実行されます。
「自分自身を動的に読み込む」とはどういう意味ですか? LD_PRELOADは、-Bsymbolicでコンパイルされていない共有ライブラリのグローバル関数を無効にすることはできませんか? –
私は、実行可能ファイルのシンボルがld.soによって動的にロードされないという事実を指摘していました。それらはld.soによってロードされないので、LD_PRELOADは単に使用されません。この場合、OPがオーバーライドしたい機能はpython実行可能ファイルにコンパイルされ、共有ライブラリからld.soによってロードされませんでした。提供されたソリューションでは、すべてのPythonがlibpython2.7.soから動的にロードされるため、LD_PRELOADが機能します。 -Bsymbolicに関しては、ライブラリの実行可能ファイルを最初に見るのではなく、独自のシンボルを優先させることが唯一の効果であると私は理解しています。 –
私はこれを試してみる必要があります。 – bukzor