У кого-нибудь есть gdb довольно-принтерный код для fd_set на linux?

Современные версии gdb позволяют интегрировать код python в «красивую печать» сложных структур данных. Есть несколько прекрасных реализаций принтеров для STL-классов C ++, а также некоторые из наиболее распространенных типов boost.org .

При сетевом программировании обычно встречаются вызовы select / poll . В то время как poll() использует массив структур данных, select() использует fd_set .

Кто-нибудь сталкивается с fd_set реализацией принтера для fd_set , желательно переносимой, но даже для конкретной платформы будет хорошо. В идеале это будет linux / x86, но я бы взял что угодно и надеюсь, что смогу адаптироваться.

One Solution collect form web for “У кого-нибудь есть gdb довольно-принтерный код для fd_set на linux?”

Alrighty, вот что я написал, который, похоже, работает для меня под Linux. Дайте мне знать, если это сработает для вас:

anonprint.py

 import gdb class fd_set_printer: """ Prints an fd_set, which is normally an opaque array of ints, each bit representing one file descriptor """ def __init__(self, val, val_array): self.val = val self.val_array = val_array @staticmethod def find_set_bits(bit_array): """ Finds set bits in a long bit list. Expects a gdb.Value which contains a C array, such as int[10], and treats it as a bitlist of int_size * 10 bits long. Returns an array of bit positions, starting with 0, for which the bits are on. eg for int foo[] = [1, 6], it will return [ 0, 33, 34 ] The array should be given as a gdb.Value """ set_bits = [] bits_length = bit_array[0].type.sizeof * 8 current_bit = 0 # Can not use 'for current_byte in gdb.Value:' even if # gdb.Value.type.code == gdb.TYPE_CODE_ARRAY # So iteration happens this ugly C-style way for current_byte_pos in xrange(*bit_array.type.range()): current_byte = bit_array[current_byte_pos] for bit in xrange(0, bits_length): bit_mask = 1 << bit if bit_mask & current_byte == bit_mask: set_bits.append(current_bit) current_bit += 1 return set_bits def to_string(self): fd_list = self.find_set_bits(self.val_array) if len(fd_list) == 0: output = "Empty file descriptor set." else: output = "File descriptor set: " output += ', '.join(map(str, fd_list)) return output def anon_struct_lookup_function(val): """ Checks if the given value looks like an fd_set. If it does, delegates printing to the printer """ lookup_tag = val.type.tag if lookup_tag == None: return None if lookup_tag != "<anonymous struct>": return None fields = val.type.fields() val_array = None if len(fields) == 1 and fields[0].name == 'fds_bits': val_array = val['fds_bits'] elif len(fields) == 1 and fields[0].name == '__fds_bits': val_array = val['__fds_bits'] if not val_array is None: return fd_set_printer(val, val_array) return None def add_fd_set_printer(obj = gdb): "Adds the fd_set pretty printer to the given object" obj.pretty_printers.append(anon_struct_lookup_function) 

И затем сделайте свой ~/.gdbinit :

 python import sys sys.path.insert(0, '/home/user/anonprint_py_directory_here') from anonprint import add_fd_set_printer add_fd_set_printer() end 

Это первый раз, когда я пытался взаимодействовать с внутренними компонентами gdb через Python, поэтому комментарии и предложения приветствуются.

  • Не удалось выполнить команду «x86_64-linux-gnu-gcc» с статусом выхода 1
  • Получить текущую воспроизводимую дорожку
  • что такое PYTHONPATH, когда нет PYTHONPATH?
  • `os.symlink` vs` ln -s`
  • Разрешить Ctrl-C прерывать C-расширение python
  • Основная ошибка синтаксиса программы Hello Hello
  • Как передать информацию демону Python?
  • Многопроцессорность Python: отказ от прав
  • Python CGIHTTPServer сбой с "OSError: Permission denied"
  • Операторы печати Python буферизуются с> перенаправлением вывода
  • Python запускает дочерний подпроцесс, отсоединяется и выезжает
  • Python - лучший язык программирования в мире.