2012-09-11 3 views
2

У меня есть приложение python (3.1, если это важно), которое распиливает данные для другого процесса, чтобы потреблять, и обменивать их по сетевым соединениям. По какой-то причине какой-то обмен неожиданно большой ... Я могу понять некоторые из маринованных данных и выяснить, что передается, но остается большой капля видимых двоичных данных, которые я не могу объяснить себе, например избыточные строки или большой фрагмент двоичных данных.Как я могу найти, почему мои маринованные данные такие большие?

Знаете ли вы, есть ли плагин wirehark, который мог бы помочь мне с этой задачей или другой процесс, который вы рекомендовали бы кому-то, пытающемуся выяснить, что еще должно было быть =None 'd до того, как объект передается по соединению ?

RouteDirect 
q.).q.}q.(X...._RouteDirect__dst_nodeq.cnode 
Node 
q.).q.}q.(X...._Node__status_upq.NX...._Node__neighbourhoodq.NX...._Node__sendq.NX 
..._Node__cpeq 
cequation 
CPE 
q.).q.}q^M(X...._CPE__dim_countq.}q.X...._CPE__internal_nodesq.]q.ubX...._Node__major_stateq.NX...._Node__partition_idq.G?.$:..4. X...._Node__name_idq.cnodeid 
NameID 
q.).q.}q.X^M..._NameID__nameq.X....checkq.sbX...._Node__dispatcherq.NX...._Node__pendingq.]q.cmessages 

^Я могу понять, что: RouteDirect, CPE и NameID являются классами в моей программе.

v Я больше удивлен об этом: там не должно быть много «простые двоичные данные» в обмене, хотя Iproto, Tflags, ISRC и IDST являются строки, содержащиеся в этих данных

q0).q1}q2(X...._Range__maxq3X....1f40q4X...._Range__min_includedq5.X...._Range__max_includedq6.X...._ 
Range__minq7h4ubX...._Component__dimensionq8h'ubh&).q9}q:h)X....Tflagsq;sbh+).q<}q=(h..h/h0).q>}q?    
([email protected]@ubh8h9ubh&).qA}qBh)X....IprotoqCsbh+).qD}qE(h..h/h0).qF}qG(h3X... 

.06qHh5.h6.h7hHubh8hAubh&).qI}qJh)X....IsrcqKsbh+).qL}qM(h..h/h0).qN}qO(h3X....7d59d8faqPh5.h6. 
h7hPubh8hIubh&).qQ}qRh)X....IdstqS  
sbh+).qT}qU(h..h/h0).qV}qW(h3X....00001011qXh5.h6.h7hXubh8hQubh&).qY}qZh)X....Tsrcq[sbh+).q\}q]   
(h..h/h0).q^}q_(h3X....0bcfq`h5.h6.h7h`ubh8hYubusbX.... 

v и это действительно недоумение.

qt).qu}qv(X...._LookupRequest__keyqwh!).qx}qyh$}qz(h&).q{}q|h)h*sbh+).q}}q~(h..h/h0).q.}q. 
(h3h4h5.h6.h7h4ubh8h{ubh&).q.}q.h)h;sbh+).q.}q.(h..h/h0).q.}q.([email protected]@ubh8h.ubh&).q.}q.h)hCsbh+).q.}q.(h..h/h0).q.}q. 
(h3hHh5.h6.h7hHubh8h.ubh&).q.}q.h)hKsbh+).q.}q.(h..h/h0).q.}q.(h3hPh5.h6.h7hPubh8h.ubh&).q.}q.h)hSsbh+).q.}q.(h..h/h0).q.}q. 
(h3hXh5.h6.h7hXubh8h.ubh&).q.}q.h)h[sbh+).q.}q.(h..h/h0).q.}q. 
(h3h`h5.h6.h7h`ubh8h.ubusbX...._LookupRequest__nonceq.G?...u...X...._LookupRequest__fromq.h.).q.}q.(h.Nh.Nh.Nh 
h.).q.}q.(h.}q. 

Что наиболее важно для меня, так это то, что кажется слишком регулярным, например, просто float/ints в двоичном формате. Он имеет некоторое сходство с числами и [shub] и множество «изолированных» q ..., что напоминает мне больше машинного кода. или это просто мои глаза?

пример опоры для травления в классе Node, # # Определите особое поведение маринования.

def __getstate__(self): 
    """Indicate witch fields should be pickled.""" 
    state = copy.copy(self.__dict__) 

    # 'state' is a shallow copy: don't modify objects' content 
    # Make transients fields point to nothing 
    state['_Node__dispatcher'] = None 
    state['_Node__send'] = None 
    state['_Node__neighbourhood'] = None 
    state['_Node__status_up'] = None 
    state['_Node__data_store'] = None 
    state['_Node__running_op'] = None 
    state['_Node__major_state'] = None 

    return state 

Многие другие объекты (например, CPE, RouteDirect) не имеют __getstate__ метод. Мне бы это понравилось, если бы была какая-то техника, которая не требует от меня просканировать все конструкторы всех классов, конечно.

+0

Как ваш травильных-кодов выглядит? – eumiro

+3

Без вашего травления и сетевого кода сложнее понять, что происходит. Вы можете попробовать сохранить ваши маринованные данные в файл для целей отладки. – Evert

+0

@Evert: true. Я ищу руководство для «как я могу оценить, почему» больше, чем «почему» на самом деле. – PypeBros

ответ

1

Ах, прочитав /usr/lib/python3.1/pickle.py, по крайней мере, сделайте одну точку менее неясной: вывод травления - это действительно какой-то байт-код для некоторого интерпретатора, с помощью кнопок push/pop, которые объясняют регулярные шаблоны ,

BINPUT   = b'q' # store stack top in memo; index is 1-byte arg 
BINGET   = b'h' # push item from memo on stack; index is 1-byte arg 
EMPTY_TUPLE = b')' # push empty tuple 
MARK   = b'(' # push special markobject on stack 

т.д.

После @ комментария Альфея, я захватил сырец трафика с использованием Wireshark "следует TCP потоку" и "сохранить как ..." функцию, то используется

x=pickle.load(open("wirecapture.bin","rb")) 

и используется Python, чтобы лучше понять, что там было. Особенно используя

len(pickle.dump(x.my_field)) 

для всех полей, представленных dir(x) позволило мне пин-точки над размером поля.К сожалению, я не мог получить

for y in dir(x): 
    print("%s: %iKb"%(y,len(pickle.dumps(x[y])/1024)) 

работает должным образом (x[y] был не действительный способ извлечения x.my_field, когда у == 'my_field'> _ <)

+0

для p в vars (x) .keys(): ... print ("% s:% s"% (p, vars (x) [p])) поможет в следующий раз ... – PypeBros

Смежные вопросы