Hexagon GDB Debugger介绍(47)

Hexagon GDB Debugger介绍(47),第1张

Hexagon GDB Debugger介绍(47)

Hexagon GDB Debugger介绍(47)
        • 4.5.2.8 Python 中的命令
        • 4.5.2.9 Writing new convenience functions

4.5.2.8 Python 中的命令

新的调试器命令可以在Python中实现。一个命令是用gdb.Command类的一个实例实现的,最常见的是使用子类。
注意 以下项目都是定义在Command类上的方法。
init name command_class [completer_class] [prefix]
Command的对象初始化器向调试器注册新的命令。这个初始化器通常是由子类自己的__init__方法调用的。
name是命令的名称。如果name由多个词组成,那么最初的词将作为前缀命令来寻找。在这种情况下,如果其中一个前缀命令不存在,就会引发一个异常。
不支持多行命令。
command_class应该是下面定义的COMMAND_常量中的一个。这个参数告知调试器如何在帮助系统中对新命令进行分类。
completer_class是一个可选的参数。如果给出,它应该是下面定义的COMPLETE_常量之一。这个参数通知调试器如何对这个命令进行完成。如果没有指定该参数,调试器会尝试使用对象的完成方法(见下文)来完成;如果没有找到这样的方法,在尝试完成时就会出现错误。
prefix是一个可选的参数。如果是True,那么新命令是一个前缀命令;这个命令的子命令可以被注册。
新命令的帮助文本取自该命令类的Python文档字符串,如果有的话。如果没有提供文档字符串,则使用默认值 “此命令没有文档”。
dont_repeat
默认情况下,当用户在命令提示符下输入空行时,调试器命令会被重复。一个命令可以通过调用 dont_ repeat 方法来抑制这种行为。这与用户命令dont-repeat(第4.2节)类似。
invoke argument from_tty
调试器在调用此命令时,会调用此方法。
argument是一个字符串。它是命令的参数,前面和后面的空白已经被剥离。
from_tty是一个布尔值参数。当为真时,它表示该命令是由用户在终端输入的;当为假时,它表示该命令来自其他地方。
如果这个方法抛出一个异常,它将被转化为一个调试器错误调用。否则,返回值被忽略。
complete text word
当用户试图完成这个命令时,调试器会调用这个方法。
所有形式的完成都由这个方法处理,即TAB和M-? 键的绑定(第2.5.3节),以及完整的命令(第2.5.7节)。
参数text和word都是字符串。text保存完整的命令行,直到光标的位置。word保存命令行的最后一个字;这是使用断字启发法计算的。
complete方法可以返回多个值:
1.如果返回值是一个序列,那么该序列的内容就被用作完成度。由完成者来确保这些内容确实完成了这个词。允许出现零长度的序列,这意味着没有可用的补全内容。只有序列中的字符串元素被使用,序列中的其他元素被忽略。
2.如果返回值是下面定义的COMPLETE_常量之一,那么相应的调试器内部的完成函数被调用,其结果被使用。
3.所有其他的结果被当作没有可用的完成函数来处理。
当一个新的命令被注册时,它必须被声明为某个一般命令类别的成员。这被用来对在线帮助系统中的顶级命令进行分类;注意,前缀命令不会被列在自己的类别下,而是列在其顶级命令的类别下。可用的分类由以下常数表示,这些常数在gdb模块中定义:
COMMAND_NONE
该命令不属于任何特定类别。这个类别的命令不显示在任何帮助类别中。
COMMAND_RUNNING
该命令与运行下级有关。例如,start、step和continue都属于这个类别。在调试器提示符下输入help running,可以看到这一类的命令列表。
COMMAND_DATA
该命令与数据或变量有关。例如,调用、查找和打印都属于这一类。在调试器提示符下输入help data可以看到这一类的命令列表。
COMMAND_STACK
该命令与堆栈的 *** 作有关。例如,backtrace、frame和return都属于这个类别。在调试器提示符下输入help stack可以看到这一类的命令列表。
COMMAND_FILES
这个类别用于与文件有关的命令。例如,file、list和section都属于这个类别。在调试器提示符下输入help files可以看到这个类别的命令列表。
COMMAND_SUPPORT
这应该用于 “support facilities”,一般是指在与调试器交互时对用户有用的东西,但与劣质品的状态没有关系。例如,help、make和shell都属于这个类别。在调试器提示符下输入help support,可以看到这一类的命令列表。
COMMAND_STATUS
该命令是与 "info "相关的命令,也就是说,与调试器本身的状态相关。例如,info、macro和show都属于这个类别。在调试器命令提示符下输入help status,可以看到这一类的命令列表。
COMMAND_BREAKPOINTS
该命令与断点有关。例如,break、clear和delete都属于这个类别。在调试器命令提示符下输入help breakpoints,可以看到这一类的命令列表。
COMMAND_TRACEPOINTS
该命令与追踪点有关。例如,trace, actions, 和 tfind 都属于这个类别。在调试器命令提示符下输入help tracepoints,可以看到这个类别的命令列表。
COMMAND_OBSCURE
该命令只在不寻常的情况下使用,或者不是用户普遍关心的。例如,checkpoint、fork和stop都属于这个类别。在调试器命令提示符下输入help obscure,可以看到这一类的命令列表。
COMMAND_MAINTENANCE
该命令只对调试器维护者有用。维护和flushregs命令都属于这个类别。在调试器提示符下输入help internals,可以看到这个类别的命令列表。

一个新的命令可以使用预定义的完成函数,可以在初始化时通过一个参数指定它,也可以从完成方法中返回它。这些预定义的完成常量都是在gdb模块中定义的:
COMPLETE_NONE
这个常量意味着不应该进行任何完成。
COMPLETE_FILENAME
这个常数意味着应该进行文件名的完成。
COMPLETE_LOCATION
这个常数表示应该进行位置完成(第2.11.2节)。
COMPLETE_COMMAND
这个常数表示应该进行调试器命令名的完成。
COMPLETE_SYMBOL
这个常数表示应该使用符号名作为源码进行完成。

下面的代码样本显示了如何在Python中实现一个微不足道的调试器命令:

 class HelloWorld (gdb.Command):
     """Greet the whole world."""
   def __init__ (self):
     super (HelloWorld, self).__init__ ("hello-world",
       gdb.COMMAND_OBSCURE)
   def invoke (self, arg, from_tty):
     print "Hello, World!"
   HelloWorld ()

最后一行实例化了这个类,对于触发调试器的命令注册是必要的。
注意 根据Python代码被读入调试器的方式,你可能需要明确地导入gdb模块。

4.5.2.9 Writing new convenience functions

你可以在 Python 中实现新的方便函数 (第 2.12.9 节)。一个方便函数是gdb.Function类的一个子类的实例。
注意 以下项目都是定义在Function类上的方法。
init name
unction的初始化器向调试器注册新函数。
name是函数的名称,用字符串表示。该函数对用户来说是可见的,是一个内部函数类型的方便变量,其名称与给定的名称相同。
新函数的文档取自新类的文档字符串。

Type 的实例具有以下属性(都是 Type 的实例变量):
*invoke args
当一个方便函数被评估时,它的参数被转换为gdb.Value的实例,然后调用该函数的invoke方法。注意,调试器并不预先确定方便函数的arity。相反,所有可用的参数都传递给 invoke,遵循标准的 Python 调用惯例。特别是,一个方便函数可以有默认的参数值,而没有任何不良影响。
这个方法的返回值被用作其在包围表达式中的值。如果返回的是一个普通的Python值,它将按照通常的规则转换为gdb.Value。
The following code sample shows how a trivial convenience function can be implemented in Python:

  class Greet (gdb.Function):
     """Return string to greet someone.
   Takes a name as argument."""
   def __init__ (self):
     super (Greet, self).__init__ ("greet")
   def invoke (self, name):
     return "Hello, %s!" % name.string ()
Greet ()

最后一行实例化了这个类,对于触发函数在调试器中的注册是必要的。
注意 根据Python代码被读入调试器的方式,你可能需要明确地导入gdb模块。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5679924.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存