#python #debugging #telnetlib
#python #отладка #telnetlib
Вопрос:
У меня есть приложение, которое вызывает telnetlib.read_until(). По большей части это работает нормально. Однако, когда происходит сбой подключения к telnet моего приложения, трудно отладить точную причину. Это мой скрипт или подключение к серверу ненадежное? (Это лаборатория разработки, поэтому здесь много сомнительных серверов).
Что я хотел бы сделать, так это иметь возможность легко отслеживать данные, помещенные в подготовленную очередь, прежде чем мое приложение вызовет telnetlib.read_until() (надеюсь, таким образом избегая влияния на работу моего приложения.)
Копаться в telnetlib.py Я обнаружил, что ‘buf[0]’ — это как раз те данные, которые мне нужны: недавно добавленные данные без повторений, вызванных отслеживанием ‘cookedq’. Я могу вставить строку прямо перед концом telnetlib.process_rawq(), чтобы распечатать обработанные данные по мере их получения с сервера.
telnetlib.process_rawq ...
...
self.cookedq = self.cookedq buf[0]
print("Dbg: Cooked Queue contents = %r" % buf[0] <= my added debug line
self.sbdataq = self.sbdataq buf[1]
Это работает хорошо. Я могу видеть данные почти в точности такими, какие были получены моим приложением, вообще не влияя на его работу.
Вот вопрос: есть ли более привлекательный способ добиться этого? Этот подход является базовым и работает, но мне придется не забывать вносить это изменение каждый раз, когда я обновляю библиотеки Python.
Мои попытки просто расширить telnet.process_rawq() не увенчались успехом, поскольку buf является внутренним для telnet.process_rawq()
Есть ли (более питонический) способ отслеживать это telnetlib.process_rawq()-внутреннее значение без изменения telnetlib.py ?
Спасибо.
Ответ №1:
Я только что нашел гораздо лучшее решение (прочитав код, да!)
в telnetlib уже встроена опция вывода отладки. Просто вызовите set_debuglevel(1), и Боб станет вашим дядей.
Ответ №2:
Самый простой способ — обезьяньим способом залатать библиотеку. Скопируйте и вставьте функцию, которую вы хотите изменить, в свой исходный код (к сожалению, process_rawq — довольно большая функция), и измените ее по мере необходимости. Затем вы можете заменить метод в классе своим собственным.
import telnetlib
def process_rawq(self):
#existing stuff
self.cookedq = self.cookedq buf[0]
print("Dbg: Cooked Queue contents = %r" % buf[0]
self.sbdataq = self.sbdataq buf[1]
telnetlib.Telnet.process_rawq = process_rawq
В качестве альтернативы вы могли бы попробовать встроенную в модуль telnetlib функцию отладки с set_debuglevel(1)
, которая выводит много информации в стандартный вывод.
В этой ситуации я бы предпочел просто захватить wireshark / tshark / tcpdump и напрямую проверить сетевой сеанс.