2017-01-17 2 views
1

Я использую встроенную поддержку Python GDB. В моем случае Python предоставит пользователю специализированный интерфейс. Внутри приложение будет вызывать различные функции GDB для выполнения действий в библиотеке C.Программный интерфейс GDB через Python

При использовании GDB-оболочки GDB обеспечивает очень приятное завершение вкладки. Но я бы хотел использовать API Python.

Я хотел бы представить завершение команды в зависимости от пользовательского ввода. В идеале я хотел бы назвать функцию GDB частичной строкой. Затем GDB должен вернуть возможные доработки.

Есть ли API-интерфейс Python, который я могу использовать для выполнения доработок?

ответ

2

Да, существует API Python. Документально here под функцией Command.complete (text, word)

по умолчанию завершившим будет делать имя файла и суб-команду завершения, но вы можете расширить, что, предоставляя свой собственный метод пользовательских complete. Вот пример:

class MyGdbCommand(gdb.Command): 
    def __init__(self): 
     super().__init__("mycmd", gdb.COMMAND_USER) # or whatever command class you deem appropriate 

    def complete(self, arguments_string, last): 
     is_brk_char = (len(arguments_string) < len(last)) 
     args = gdb.string_to_argv(arguments_string) 
     if arguments_string == "" or arguments_string[-1:] == " ": 
      args.append("") # Add dummy argument to complete 
     argc = len(args) 

     if argc == 1: 
      if is_brk_char: 
       return gdb.COMPLETE_NONE 
      if args[0] in ['-l', '-o']: 
       return args[0] # it's complete 
      return ['-l', '-o'] # valid option flags 

     if argc == 2 and (args[0] == '-l' or args[0] == '-o'): 
      if is_brk_char: 
       return gdb.COMPLETE_FILENAME # -l and -o take file arguments 
      (head, tail) = os.path.split(curr) 
      return getMatchingFiles(head, tail) # implement appropriate heuristic; pass args[0] flag if it matters 

     if argc == 3: 
      if is_brk_char: 
       return gdb.COMPLETE_NONE 
      if args[0] == '-l': 
       return ['-o'] 
      if args[0] == '-o': 
       return ['-l'] 
      return [] 

     if argc == 4: 
      if is_brk_char: 
       return gdb.COMPLETE_FILENAME 
      (head, tail) = os.path.split(curr) 
      return getMatchingFiles(head, tail)   

     if is_brk_char: 
      return gdb.COMPLETE_NONE 
     return [] # No more valid options 

ПРИМЕЧАНИЕ! Компетент не несет ответственности за проверку. Это должно быть сделано после вызова метода вашей команды invoke().

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