我正在尝试调试使用第三方包的多线程程序。如何在调试时检测实例数据属性更改?
在某个时候,某个对象的属性(不是由我直接创建)的一个属性发生了变化,我无法弄清楚是什么改变了它。我找不到直接改变它的代码。
由于这是第三方软件包,我不想直接更改其代码,而是根据需要从外部修补它。
我的计划是以某种方式利用或包装代码来设置它并设置断点或从那里打印堆栈跟踪。
我试着猴子补丁实例的__setattr__
方法,但它没有被触发。
我也试图平息类本身:
def patch_class(target):
def method(self, name, value):
print(name, value)
print("called from", target)
setattr(self, name, value) # break or print trace here
target.__setattr__ = types.MethodType(method, target)
patch_class(WebSocket)
但随后所有的属性都在类本身设置,由于该方法被绑定到它。
用代理包装类也没有什么帮助,因为我没有自己实例化它,而是在它创建后的某个时候访问实例。
如果有问题,说上课是ws4pyWebSocket
是由另一个第三方包创建的,但我认为这是一般性调试技巧的练习。
是否有更多的“pythonic”方式攻入现有实例的变种(hack-ish的方式也将被赞赏)?
怎么样一个属性的getter和setter,然后在setter中调试? –
好吧,我不想更改软件包代码。我设法使用'wrapt.ObjectProxy'做一些事情,但我想知道是否有另一种方法。一旦它稳定下来,我会发布它。 – MasterAM