我试图用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