2012-09-11 23 views
4

我正在使用/修復collective.logbook以保存網站上的錯誤。Plone:TypeError:無法在採集包裝中醃製對象

File "/srv/plone/xxx/src/collective.logbook/collective/logbook/events.py", line 101, in hand 
    transaction.commit() 
    File "/srv/plone/buildout-cache/eggs/transaction-1.1.1-py2.6.egg/transaction/_manager.py", line 8 
    return self.get().commit() 
    File "/srv/plone/buildout-cache/eggs/transaction-1.1.1-py2.6.egg/transaction/_transaction.py", li 
    self._commitResources() 
    File "/srv/plone/buildout-cache/eggs/transaction-1.1.1-py2.6.egg/transaction/_transaction.py", li 
    rm.commit(self) 
    File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/Connection.py", lin 
    self._commit(transaction) 
    File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/Connection.py", lin 
    self._store_objects(ObjectWriter(obj), transaction) 
    File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/Connection.py", lin 
    p = writer.serialize(obj) # This calls __getstate__ of obj 
    File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/serialize.py", line 
    return self._dump(meta, obj.__getstate__()) 
    File "/srv/plone/buildout-cache/eggs/ZODB3-3.10.5-py2.6-linux-x86_64.egg/ZODB/serialize.py", line 
    self._p.dump(state) 
TypeError: Can't pickle objects in acquisition wrappers. 

這顯然是因爲日誌嘗試寫入其指的是獲取的對象錯誤的記錄:目前日誌在我的網站上的一些異常失敗。我認爲解決方案是清除這些對象的錯誤。

但是,我怎樣才能找出什麼是壞對象,它如何最終到達事務管理器,以及導致此問題的Python對象引用是什麼?或者任何可以幫助我調試這個問題的東西?

回答

3

如果你能重現這一可靠,你可以把在ZODB連接_register方法print語句或pdb.set_trace()(在ZODB/connection.pyZODB蛋內):

def _register(self, obj=None): 
    # ... skipped lines ... 

    if obj is not None: 
     self._registered_objects.append(obj) 
     # Insert print statement here. 

現在,每當任何對象已被標記爲更改或添加到連接作爲新的對象,它將被打印到控制檯。這應該可以幫助您進行調試過程。祝你好運!

+1

這是否涉及讀寫對象?任何方式來標記只寫的對象? –

+1

這應該只涉及書寫的對象;他們正在向後面的提交連接註冊。 –