我正在嘗試調試使用第三方包的多線程程序。如何在調試時檢測實例數據屬性更改?
在某個時候,某個對象的屬性(不是由我直接創建)的一個屬性發生了變化,我無法弄清楚是什麼改變了它。我找不到直接改變它的代碼。
由於這是第三方軟件包,我不想直接更改其代碼,而是根據需要從外部修補它。
我的計劃是以某種方式利用或包裝代碼來設置它並設置斷點或從那裏打印堆棧跟蹤。
我試着猴子補丁實例的__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