Кто знает Python? Помогите с его трейсом

BA
На сайте с 16.12.2008
Offline
26
653

Traceback (most recent call last):

File "/usr/lib64/python2.4/site-packages/twisted/python/log.py", line 84, in callWithLogger

return callWithContext({"system": lp}, func, *args, **kw)

File "/usr/lib64/python2.4/site-packages/twisted/python/log.py", line 69, in callWithContext

return context.call({ILogContext: newCtx}, func, *args, **kw)

File "/usr/lib64/python2.4/site-packages/twisted/python/context.py", line 59, in callWithContext

return self.currentContext().callWithContext(ctx, func, *args, **kw)

File "/usr/lib64/python2.4/site-packages/twisted/python/context.py", line 37, in callWithContext

return func(*args,**kw)

--- <exception caught here> ---

File "/usr/lib64/python2.4/site-packages/twisted/internet/selectreactor.py", line 146, in _doReadOrWrite

why = getattr(selectable, method)()

File "/usr/lib64/python2.4/site-packages/twisted/internet/tcp.py", line 460, in doRead

return self.protocol.dataReceived(data)

File "/root/pyicqt-0.8.1.5/src/tlib/oscar.py", line 663, in dataReceived

File "/root/pyicqt-0.8.1.5/src/tlib/oscar.py", line 811, in oscar_Data

File "/root/pyicqt-0.8.1.5/src/tlib/oscar.py", line 1458, in oscar_01_10

struct.error: unpack str size does not match format

Вот трейс ошибки в питоне. Скажите, плиз, в каком именно файле в какой строке непостредственно произошла ошибка unpack str size does not match format, которая и вызывает ошибку? Чтобы трай-кетч (аль как оно в питоне зовется) туда можно было вставить.

тишина
T.R.O.N
На сайте с 18.05.2004
Offline
314
#1

Bill A.,

Питоном занимался мало, но очень похоже что какой-то глюк с библиотекой/фреймворком twisted. Может проблема с версиями/сборками или нет необходимых ему библиотек

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
BA
На сайте с 16.12.2008
Offline
26
#2

Это pyicqt, транспорт жаббера к аське

уж точно не из-за любви к искусству пытаюсь пофиксить эту проблему :) гуглил все, но решения не нашел

Вот и хочу понять конкретную проблемную строчку, чтобы перехватывать там эту ошибку. Может все наладится :)

[Удален]
#3

Bill A., с виду какая то проблема с трафиком либо библиотекой оскара (айсику насколько я понял), формат пакета неправильный либо библиотеки

bearman добавил 10.03.2010 в 10:50

где то в этой "области")

Simm
На сайте с 11.03.2007
Offline
60
#4

Некоторые мои соображения.

проблема в строке 1458 файла pyicqt-0.8.1.5/src/tlib/oscar.py, в этой функции:

def oscar_01_10(self,snac):
skip = struct.unpack('!H',snac[5][:2])[0]
newLevel = struct.unpack('!H',snac[5][2+skip:4+skip])[0]/10
if len(snac[5])>4+skip:
by = self.parseUser(snac[5][4+skip:])
else:
by = None
self.receiveWarning(newLevel, by)

Сама функция - один из методов класса BOSConnection.

Идем выше, на строчку 811 в функцию класса SNACBased, который является родителем класса BOSConnection.

Функция oscar_Data:

def oscar_Data(self,data):
<...>
func=getattr(self,'oscar_%02X_%02X'%(snac[0],snac[1]),None)
if not func:
self.oscar_unknown(snac)
else:
func(snac)
return "Data"

И еще выше в класс OscarConnection в функцию dataReceived:

def dataReceived(self,data):
<...>
func=getattr(self,"oscar_%s"%self.state,None)
if not func:
log.msg("no func for state: %s" % self.state)
return
<...>

Т.о. в log.msg, которая является частью библиотеки twisted нужно передать сообщение "no func for state: %s". Но атрибут state связан с другими классами, так или иначе дело доходит до функции oscar_Data, в которой переменной func передается атрибут-функция, выбор которого определяет snac (некий параметр получаемый извне). Этот атрибут в нашем случае -- функция oscar_01_10. Т.о. вызов func(snac), который мы увидим позже -- и есть вызов функции oscar_01_10, в котором и произошла ошибка. А ошибка чисто структурная, из модуля struct. В результате - log.msg не может принять нужный параметр, поэтому в вершине иерархии трейса - библиотека twisted.

Как-то так. Если кто в чем поправит, буду благодарен.

Чтобы надежно пофиксить, нужно глубже повкуривать код.

Поймать ошибку можно с помощью

exception struct.error, err:

print str(err)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий