저는 LD_PRELOAD를 사용하여 PyDict_New 함수를 가로 채려고합니다. 나는 this recipe이 파이썬 인터프리터에서 getpid로 작업했음을 확인했으며, 대신 adapted it to use PyDict_New을 가졌지 만 예상대로 작동하지 않는다. 사전을 명확하게 할당하고 있지만이 함수를 사용해야 할 경우에도 재정의가 호출되지 않습니다.는 LD_PRELOAD로 PyDict_New를 가로 챌 수 없습니다.
내가 뭘 잘못하고 있니?
배경 : 매우 큰 시스템에서 문제를 디버깅하려고합니다. 나는 나쁜 참조 카운트를 가진 dict가 있다는 것을 발견했다. dict이 처음으로 할당 된 곳과 문제가 어디에서 발생했는지는 알지만, 중간 시간에는 카운트가 나빠질 것이고 간단한 코드 추적은하지 않을 것입니다. dict는 캐시되고 다시 사용되기 때문입니다. (PyDict_New를 통해) gc 시스템에 의해.
"스스로 동적으로로드"한다는 것은 무엇을 의미합니까? LD_PRELOAD가 -Bsymbolic로 컴파일되지 않은 공유 라이브러리의 전역 함수를 재정의 할 수 있습니까? –
나는 실행 파일의 심볼이 ld.so에 의해 동적으로로드되지 않는다는 사실을 언급했다. ld.so에 의해로드되지 않기 때문에 LD_PRELOAD는 단순히 사용되지 않습니다. 이 경우, OP가 재정의하고자하는 함수는 python 실행 파일로 컴파일되었고 공유 라이브러리에서 ld.so에 의해로드되지 않았습니다. 제공된 솔루션에서 모든 파이썬은 libpython2.7.so에서 동적으로로드되므로 LD_PRELOAD가 작동합니다. -Bsymbolic에 관해서는, 저의 이해는 라이브러리가 실행 파일의 첫 번째를 보는 대신 자체 심볼을 먼저 선호하도록하는 것입니다. –
나는 이것을 시험해 볼 필요가있다. – bukzor