通过Python编程的GDB完成接口

时间:2017-01-17 18:08:56

标签: python c interface gdb

我正在使用GDB内置的Python支持。在我看来,Python将为用户提供专门的界面。在内部,应用程序将调用各种GDB函数来对C库执行操作。

使用GDB shell时,GDB提供非常好的制表符完成功能。但我想使用Python API。

我想根据用户输入显示命令完成。理想情况下,我想用部分字符串调用GDB函数。然后GDB应该返回可能的完成。

是否有可用于执行完成的Python API?

1 个答案:

答案 0 :(得分:2)

是的,有一个Python API。它在Command.complete (text, word)

函数下记录here

默认的完成符将执行文件名和子命令完成,但您可以通过提供自己的自定义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()方法,就应该这样做。